我有两个非常简单的脚本,不同之处仅在于存在空白的第一行:
$ cat test.bash
#!/bin/bash
echo ${UID}
$ cat test_blank.bash
#!/bin/bash
echo ${UID}
Run Code Online (Sandbox Code Playgroud)
现在我运行,有和没有nice
:
$ ./test.bash
1060
$ ./test_blank.bash
1060
$ nice ./test.bash
1060
$ nice ./test_blank.bash
Run Code Online (Sandbox Code Playgroud)
请解释为什么在最后一种情况下,UID
变量未设置.nice
用sudo
或替换时的行为是相同的nohup
.
注意:
$ bash test_blank.bash
1060
$ dash test_blank.bash
Run Code Online (Sandbox Code Playgroud)
bash
产生输出但是dash
,这是sh
debian类系统的默认值,但不是.这是因为bash
设置UID
但破折号没有.(POSIX不需要设置shell UID
.)因此,问题变成了哪个shell执行脚本.
当bash看到时./test.sh
,它(bash)运行脚本.当另一个命令(例如nice
,接收脚本作为参数并且脚本没有有效的shebang作为第一行)时,可能dash
会运行默认shell .
如果您想要破折号中的UID,或任何其他不提供它的shell,请使用以下id
命令:
UID=$(id -u)
Run Code Online (Sandbox Code Playgroud)
要查看哪个shell正在运行脚本,请使用:
$ cat test2.sh
#!/bin/bash
ps $$
echo UID=${UID}
Run Code Online (Sandbox Code Playgroud)
下bash
:
$ ./test2.sh
PID TTY STAT TIME COMMAND
1652 pts/12 S+ 0:00 bash -rcfile .bashrc
UID=1060
Run Code Online (Sandbox Code Playgroud)
nice
相反,如果我们使用它调用它,我们可以看到它正在运行/bin/sh
并且未分配UID变量:
$ nice test2.sh
PID TTY STAT TIME COMMAND
1659 pts/12 SN+ 0:00 /bin/sh test2.sh
UID=
Run Code Online (Sandbox Code Playgroud)