我有两个非常简单的脚本,区别仅在于存在空白的第一行:
$ 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
时,行为相同。
答案 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正在运行脚本,请使用:
$ ./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