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

Why*_*ord 3 bash shell

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

$ 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变量未设置.nicesudo或替换时的行为是相同的nohup.

Joh*_*024 6

注意:

$ bash test_blank.bash
1060
$ dash test_blank.bash
Run Code Online (Sandbox Code Playgroud)

bash产生输出但是dash,这是shdebian类系统的默认值,但不是.这是因为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

要查看哪个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)