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
我有一个表达式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