Bash 中运算符的优先级

Precedence of operators in Bash

我有一个表达式cat file.txt | script.sh 1> output.txt || mkdir TEST &。末尾的&是表示只有mkdir在后台执行还是整个表达式?

关于&,会影响整个表达式。 你可以很容易地用一些不像简单的优雅的东西来检查它:

echo '1' > file1  || echo '2' > file2 &

(像你一样放置一些输出重定向),否则,只是

echo '1' || echo '2' &

此处第一个 echo 的输出将 return 为真,条件中的第二部分将不会执行,但无论如何都会进入后台。

然后,您可以查看:

false || echo '2' > file2  &

或更简单的版本:

false || echo '2' &

这里会执行echo,而且会在后台执行。

然后,在这两种情况下,它都会在后台执行,即使在第一种情况下只执行第一部分,而在第二种情况下只执行第二部分。

&; 是 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