我有一个表达式cat file.txt | script.sh 1> output.txt || mkdir TEST &
。最后&
是否意味着只有mkdir
在后台或整个表达式中执行?
答案 0 :(得分:3)
关于&
,它会影响整个表达式。
您可以使用不那么简单的东西轻松检查它:
echo '1' > file1 || echo '2' > file2 &
(按照你的方式放置一些输出重定向),否则,只需
echo '1' || echo '2' &
这里第一个回声的输出将返回true,而条件中的第二个部分将不会被执行,但它仍将转到后台。
然后,您可以查看:
false || echo '2' > file2 &
或更简单的版本:
false || echo '2' &
此处,将执行回声,也将在后台执行。
然后,在两种情况下,它都将在后台执行,即使在第一种情况下只执行第一部分而在第二种情况下只执行第二部分。
答案 1 :(得分:2)
&
和;
是POSIX shell语言中的分隔符。它们适用于整个管道。
你可以设计一个实验来(dis)证明它:
[ ! -d TEST ] || rmdir TEST #cleanup
sleep 1 | (sleep 1 ; false) || mkdir TEST &
ls -d TEST #will run immediately (because & applied to the whole pipeline)
#but fail because the `||` part wasn't reached yet
或者您可以在shell grammar的POSIX规范中查找。
答案 2 :(得分:1)
如果将&
放在命令的末尾,它将在后台运行整个命令。你可以做这样的事情在后台并行运行
(cat file.txt | grep e > output.txt) & (mkdir TEST) &
这个答案可能会说清楚:Answer