通常我希望bash在用分号
分隔时按顺序执行命令例如,cmd1在cmd2之前执行:cmd1;cmd2
但我遇到的情况并非如此。
echo 'my password' | sudo -S su -c "echo a 1>&2 ; $(echo b 1>&2)" root
我希望输出为
a
b
但实际上
b
a
为什么吗
这与su命令的c标志有关吗?当我将第二个命令放在子shell中时,似乎只会发生这种情况。
请注意,IO重定向并不是罪魁祸首 - 我补充说,这只是为了简单地演示我的问题。如果您在其中添加了不同的命令,例如cd
和stat
,则您会发现它们确实无序执行。
答案 0 :(得分:1)
$ echo "hello $(echo world)"
hello world
$( ... )
在里面运行命令并替换收集的输出,即上面的命令最终运行echo "hello world"
。
类似地,
sudo -S su -c "echo a 1>&2 ; $(echo b)"
最终会运行
sudo -S su -c "echo a 1>&2 ; b"
但是使用$(echo b 1>&2)
命令会将b
写入stderr(并且不会将任何内容写入stdout),因此当shell处理字符串时,您会看到b
出现在屏幕上,然后是整个$( ... )
构造被替换为什么(因为它没有向stdout写入任何东西)。
最终运行的是
sudo -S su -c "echo a 1>&2 ; " root
如果您只想在子shell中运行命令,那就是( ... )
,而不是$( ... )
。