跑步有什么区别:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(假设./myscript
是可执行的)?
答案1
./myscript
myscript
使用 shebang 中指定的任何解释器运行。myscript
需要设置可执行位。
bash ./myscript
myscript
使用 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)来看到./myscript
bash ./myscript
bash -c ./myscript
SHLVL
bash terminal > running bash -c > running shebang line with bash
通常您处于 bash 终端会话中,执行./myscript
shebang 行时会调用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