最近,我在我的Ubuntu14.04LTS上安装了PC ^ 2,以构成我们大学的ACM-ICPC竞赛环境。但是当我运行shell文件“pc2server”时,系统会给我一个错误警告
pc2server: 27: pc2server: Syntax error: "&" unexpected
所以我检查文件pc2server并找到第27行。我发现代码是
java -d64 -version |& grep -q "Error" && JAVA32=1
我知道|
和&
的含义是什么,但我只想知道的是|&
的含义是什么。
答案 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;标准错误的隐式重定向在命令指定的任何重定向之后执行。