zoukankan      html  css  js  c++  java
  • linux里source、sh、bash、./有什么区别

    在linux里,source、sh、bash、./都可以执行shell script文件,那它们有什么不同吗?

    -----------

    1、source

    source a.sh

    当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限"

    source命令可以简写为"."

    . a.sh

    注意:中间是有空格的。

    2、sh/bash

    sh a.sh
    bash a.sh

    都是打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限"

    通常在subshell里运行的脚本里设置变量,不会影响到父shell的。

    3、./

    ./a.sh
    #bash: ./a.sh: 权限不够
    chmod +x a.sh
    ./a.sh

    打开一个subshell去读取、执行a.sh,但a.sh需要有"执行权限"

    可以用chmod +x添加执行权限

    另外,使用./来执行的文件里有alias语句的话,shell并不会把alias别名扩展成对应的命令,要解决的话,得使用shopt命令来开启alias扩展选项

    shopt -s expand_aliases

    4、fork、source、exec

    • 使用fork方式运行script时, 就是让shell(parent process)产生一个child process去执行该script,当child process结束后,会返回parent process,但parent process的环境是不会因child process的改变而改变的。
    • 使用source方式运行script时, 就是让script在当前process内执行, 而不是产生一个child process来执行。由于所有执行结果均于当前process内完成,若script的环境有所改变, 当然也会改变当前process环境了。
    • 使用exec方式运行script时, 它和source一样,也是让script在当前process内执行,但是process内的原代码剩下部分将被终止。同样,process内的环境随script改变而改变。

    通常如果我们执行时,都是默认为fork的。

    为了实践下,我们可以先建立2个sh文件,以下代码来自ChinaUnix的網中人

    1.sh

    复制代码
    #!/bin/bash
    A=B
    echo "PID for 1.sh before exec/source/fork:$$"
    export A
    echo "1.sh: $A is $A"
    case $1 in
        exec)
            echo "using exec..."
            exec ./2.sh ;;
        source)
            echo "using source..."
            . ./2.sh ;;
        *)
            echo "using fork by default..."
            ./2.sh ;;
    esac
    echo "PID for 1.sh after exec/source/fork:$$"
    echo "1.sh: $A is $A"
    复制代码

    2.sh

    #!/bin/bash
    echo "PID for 2.sh: $$"
    echo "2.sh get $A=$A from 1.sh"
    A=C
    export A
    echo "2.sh: $A is $A"

    自己运行下,观看结果吧 :)

    chmod +x 1.sh
    chmod +x 2.sh
    ./1.sh fork
    ./1.sh source
    ./1.sh exec
  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/brithToSpring/p/14528644.html
Copyright © 2011-2022 走看看