语法是什么“|&”用shell语言表示?

时间:2016-03-10 13:12:17

标签: linux shell

最近,我在我的Ubuntu14.04LTS上安装了PC ^ 2,以构成我们大学的ACM-ICPC竞赛环境。但是当我运行shell文件“pc2server”时,系统会给我一个错误警告

pc2server: 27: pc2server: Syntax error: "&" unexpected

所以我检查文件pc2server并找到第27行。我发现代码是

java -d64 -version |& grep -q "Error" && JAVA32=1

我知道|&的含义是什么,但我只想知道的是|&的含义是什么。

2 个答案:

答案 0 :(得分:8)

来自bash手册页:

  

管道

     

管道是由一个控制操作符||&分隔的一个或多个命令的序列。管道的格式是:

[time [-p]] [ ! ] command [ [|│|&] command2 ... ]
     

命令的标准输出通过管道连接到command2的标准输入。此连接在命令指定的任何重定向之前执行(请参阅下面的REDIRECTION)。 如果使用|&,则命令的标准错误通过管道连接到command2的标准输入;它是2>&1 | 的简写。在命令指定的任何重定向之后执行标准错误的隐式重定向。

检查你的哈希爆炸线。 Plain sh不支持|&

答案 1 :(得分:0)

请检查约翰的回答。在这里,我添加了一个示例,以便详细说明。

# cat /tmp/test1
cat: /tmp/test1: No such file or directory
# cat /tmp/test1 2> /dev/null | grep "No such file or directory"
# cat /tmp/test1 2> /dev/null |& grep "No such file or directory"
cat: /tmp/test1: No such file or directory

第一个命令返回错误,因为文件不存在(命令的 stderr 输出)。

第二个命令不返回任何输出,因为 cat 命令的 stderr 是重定向 /dev/null,所以 grep 命令不会得到 stderr cat 命令通过管道。

即使 cat 命令的 stderr 被重定向到 /dev/null,第三个命令也会返回输出,因为管道带有与符号 (|&)。它将command1的stdout和stderr连接到command2的stdin;标准错误的隐式重定向在命令指定的任何重定向之后执行。