Bash shell脚本的空白第一行:解释UID变量的行为

Bash shell脚本的空白第一行:解释UID变量的行为,bash,shell,Bash,Shell,我有两个非常简单的脚本,不同之处在于第一行是空白的: $ cat test.bash #!/bin/bash echo ${UID} $ cat test_blank.bash #!/bin/bash echo ${UID} 现在我运行时,无论有无nice: $ ./test.bash 1060 $ ./test_blank.bash 1060 $ nice ./test.bash 1060 $ nice ./test_blank.bash 请解释在最后一种情况下,UID变量未设置的

我有两个非常简单的脚本,不同之处在于第一行是空白的:

$ cat test.bash
#!/bin/bash
echo ${UID}
$ cat test_blank.bash

#!/bin/bash
echo ${UID}
现在我运行时,无论有无
nice

$ ./test.bash
1060

$ ./test_blank.bash
1060

$ nice ./test.bash
1060

$ nice ./test_blank.bash
请解释在最后一种情况下,
UID
变量未设置的原因。将
nice
替换为
sudo
nohup
时的行为相同,请注意:

$ bash test_blank.bash
1060
$ dash test_blank.bash
bash
生成输出,但类似debian的系统上默认的
sh
不生成输出。这是因为
bash
设置
UID
,而dash不设置。(不需要shell来设置
UID
)因此,问题变成由哪个shell执行脚本

当bash看到
/test.sh
时,它(bash)运行脚本。当另一个命令(如
nice
)接收到脚本作为参数,并且脚本没有有效的shebang作为第一行时,则会运行默认shell,可能是
dash

如果要在dash中使用UID,或任何其他不提供UID的shell,请使用
id
命令:

UID=$(id -u)
找出哪个shell正在运行脚本 要查看哪个shell正在运行脚本,请使用:

$ cat test2.sh

#!/bin/bash
ps $$
echo UID=${UID}
bash
下:

$ ./test2.sh
  PID TTY      STAT   TIME COMMAND
 1652 pts/12   S+     0:00 bash -rcfile .bashrc
UID=1060
相反,如果我们使用
nice
调用它,我们可以看到它在
/bin/sh
下运行,并且UID变量没有赋值:

$ nice test2.sh
  PID TTY      STAT   TIME COMMAND
 1659 pts/12   SN+    0:00 /bin/sh test2.sh
UID=

如果您也在脚本中回显
$SHELL
(可能还有
$0
)的值,您可能会得到线索。另外,请阅读shebang
#行可以工作。我不能复制(至少在OSX上不能,但已知shebang处理在不同的操作系统中是不同的)。关于@EtanReisner的建议:我认为
$SHELL
帮助不大,因为它是从环境中继承的,可以是任何东西。至于
$0
,它不只是被调用的脚本路径吗?这怎么能给你线索?@4AE1E1HM。。。诚然,
$SHELL
$0
并不像我希望的那样有用。(尽管取消导出
$SHELL
应该让它做我想做的事情,假设大多数SHELL在未设置时自行设置。)我想,这让John1024的答案成为找到我试图暗示的信息的最佳方式。