调用 bash 脚本至少有 3 种可能的方法:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
有人说在案例 #3 调用(-c
选项)中层次结构中多了一个 bash 进程。我准备了一个简单的测试脚本:
echo "SHLVL: $SHLVL"
ps aux | grep bash
SHLVL
在 #3 的情况下,变量确实大了一,但ps
在 #3 的情况下没有输出任何额外的 bash 进程。与脚本连接的唯一 bash 进程是
bin/bash ./testscript
那么这个额外的 bash 进程在哪里呢?
答案1
实际上,bash 中似乎有一个优化。
让我们编写一个sleep20s
脚本:
#! /bin/bash
sleep 20
为了避免歧义,让我们启动一个 ksh shell。
使用此命令:bash -c "./sleep20s"
,您可以获得:
ksh
sleep20s
sleep
哎呀,bash 在哪里?但是如果我们做一些需要 bash 解释器的事情,比如两次调用相同的命令:bash -c "./sleep20s;./sleep20s"
,那么你会得到:
ksh
bash
sleep20s
sleep
bash 又回来了。因此 bash 可以很聪明,exec
在简单情况下使用 an 来启动子脚本。