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

时间:2015-11-19 05:01:20

标签: 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变量未设置。将nice替换为sudonohup时,行为相同。

1 个答案:

答案 0 :(得分:6)

观察:

$ bash test_blank.bash
1060
$ dash test_blank.bash

bash会产生输出但dash,这是类似debian的系统上的默认sh,而不是。bash。这是因为UID设置UID但是破折号没有设置./test.sh。 (POSIX不需要shell来设置nice。)因此,问题变成了哪个shell执行脚本。

当bash看到dash时,它(bash)会运行脚本。当另一个命令(例如id)接收脚本作为参数并且脚本没有有效的shebang作为第一行时,则运行默认shell(可能是UID=$(id -u)

如果您希望破折号中的UID或任何其他未提供UID的shell,请使用$ cat test2.sh #!/bin/bash ps $$ echo UID=${UID} 命令:

bash

找出运行脚本的shell

要查看哪个shell正在运行脚本,请使用:

$ ./test2.sh
  PID TTY      STAT   TIME COMMAND
 1652 pts/12   S+     0:00 bash -rcfile .bashrc
UID=1060

nice下:

/bin/sh

相反,如果我们使用$ nice test2.sh PID TTY STAT TIME COMMAND 1659 pts/12 SN+ 0:00 /bin/sh test2.sh UID= 调用它,我们可以看到它在execute 'generate ssl cert for simple https file server' do cwd '/root/git/chef-bluecloud/bin/' command <<-EOH openssl req -new -days 365 -nodes -x509 \ -subj "/C=US/ST=NY/L=Somers/O=IBM/CN=bluecloud.xyz.com" \ -keyout localhost.pem \ -out localhost.pem EOH not_if 'test -f localhost.pem' # TODO: use ruby code instead of bash ::File.exists(...) end 下运行且未分配UID变量:

it 'checks ssl cert generation for simple https file server' do
  expect(chef_run).to run_execute('openssl req -new -days 365 -nodes -x509 \
  -subj "/C=US/ST=NY/L=Somers/O=IBM/CN=bluecloud.xyz.com" \
  -keyout localhost.pem \
  -out localhost.pem \
  ').with(cwd:'/root/git/chef-bluecloud/bin/')
  expect(chef_run).to_not run_execute('openssl null').with(cwd:'/root/git/chef-bluecloud/bin/')
end