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的答案成为找到我试图暗示的信息的最佳方式。