【发布时间】:2018-06-13 11:38:09
【问题描述】:
我有一个表达式cat file.txt | script.sh 1> output.txt || mkdir TEST &。最后&是指只有mkdir在后台执行还是整个表达式执行?
【问题讨论】:
我有一个表达式cat file.txt | script.sh 1> output.txt || mkdir TEST &。最后&是指只有mkdir在后台执行还是整个表达式执行?
【问题讨论】:
关于&,会影响整个表情。
你可以很容易地用一些不那么简单的东西来检查它:
echo '1' > file1 || echo '2' > file2 &
(按照你的方式放置一些输出重定向),否则,只是
echo '1' || echo '2' &
这里第一个 echo 的输出将返回 true,并且条件中的第二部分不会执行,但无论如何它都会进入后台。
然后,您可以检查:
false || echo '2' > file2 &
或更简单的版本:
false || echo '2' &
在这里,回显将被执行,并且也在后台执行。
然后,在这两种情况下,它都会在后台执行,即使在第一种情况下只执行第一部分,而在第二种情况下只执行第二部分。
【讨论】:
(cat file.txt | script.sh 1> output.txt || mkdir TEST) &和cat file.txt | script.sh 1> output.txt || mkdir TEST &有区别吗?
& 和 ; 是 POSIX shell 语言中的分隔符。它们适用于整个管道。
您可以设计一个实验来(反)证明它:
[ ! -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
或者您可以在 POSIX 规范中查找 shell grammar。
【讨论】:
如果您将& 放在命令末尾,它将在后台运行整个命令。你可以做这样的事情在后台并行运行它
(cat file.txt | grep e > output.txt) & (mkdir TEST) &
这个答案可能会说清楚:Answer
【讨论】: