用su表示bash subshel​​l命令执行顺序

时间:2016-06-27 00:51:10

标签: bash shell

通常我希望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重定向并不是罪魁祸首 - 我补充说,这只是为了简单地演示我的问题。如果您在其中添加了不同的命令,例如cdstat,则您会发现它们确实无序执行。

1 个答案:

答案 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中运行命令,那就是( ... ),而不是$( ... )