运行 bash 脚本模式

运行 bash 脚本模式

跑步有什么区别:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(假设./myscript是可执行的)?

答案1

./myscriptmyscript使用 shebang 中指定的任何解释器运行。myscript需要设置可执行位。

bash ./myscriptmyscript使用 bash运行。myscript不需要是可执行文件,并且由于 bash 被赋予了一个要运行的文件,它甚至不会在 PATH 中寻找它,因此也bash myscript能正常工作。

bash -c "./myscript"启动一个 bash 实例来执行命令,这恰好使该命令./myscript使用 shebang 中指定的任何解释器执行(因此它类似于第一种情况,但添加了一个 bash 进程)。 的参数是bash -c任何 bash 命令或命令序列(尝试bash -c "echo 'aa';echo 'bb'")。

你还没提到. ./myscript

答案2

假设myscript是可执行文件并且具有指向二进制文件的shebang行-单独bash运行或运行之间没有区别,但运行会创建一个以上的子shell级别-你可以通过检查var(3 x bash)来看到./myscriptbash ./myscriptbash -c ./myscriptSHLVLbash terminal > running bash -c > running shebang line with bash

通常您处于 bash 终端会话中,执行./myscriptshebang 行时会调用bash并创建一个bash subshell正在运行命令的终端。

30311 pts/0    Ss     0:00 -bash
 8419 pts/0    S+     0:00  \_ /bin/bash ./test.sh
 8420 pts/0    R+     0:00      \_ ps f
SHELL LEVEL: 2  # is 3 when running with bash -c
8419  # that's the $BASHPID

请获取下面的代码(test.sh)并亲自尝试一下。

#!/bin/bash

ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID

相关内容