OS:Mac OS
cat file.txt || ./a.out
,它起作用,但cat file.txt | ./a.out
不起作用,为什么?
我在哪里可以找到文档来学习它(我不知道如何搜索…(?
c代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
while (*++argv)
printf("%sn", *argv);
return 0;
}
cat file.txt | ./a.out
:
cat file.txt
的输出将作为./a.out
的输入
cat file.txt || ./a.out
:
这是一个";OR";操作员,如果cat file.txt
失败,则执行./a.out
,但如果cat file.txt
成功,则不执行./a.out
。
||
和|
是unixshell运算符。它们看起来可能相似,但||
和|
完全不同。
|
是管道运算符。它将左命令的标准输出连接到右命令的标准输入。
默认情况下,每个命令的标准输出都是终端屏幕。
% echo -e "anbnc"
a
b
c
但是|
操作符允许我们将标准输出重定向到下一个命令的标准输入:
% echo -e "anbnc" | grep a
a
shell处理打开管道并将其输出和输入文件描述符分别连接到左命令和右命令。因此,实际的命令通常不必知道或关心它们的输出是终端、文件还是管道后面的另一个程序。
||
是逻辑OR运算符。如果第一个命令没有返回成功退出代码(即0
(,它将运行第二个命令。
% test -f /usr/local/bin || echo "/usr/local/bin is not a file"
/usr/local/bin is not a file
% test -f /bin/bash || echo "/bin/bash is not a file"
还有一个逻辑和运算符起相反的作用:
% test -f /bin/bash && echo "/bin/bash is a file"
/bin/bash is a file
这反过来不应该与&
操作符混淆,后者将命令置于后台。
% sleep 3 &
[1] 55981
% jobs
[1] + running sleep 3
% fg
[1] + running sleep 3
%
一般来说,shell语法可能相当深奥,您应该意识到每个shell都有点不同(例如c/bourne/korn-shells与bash与zsh,后者现在是Mac Os上的标准(
这与您通过argv
和argc
访问的命令行参数完全不同。如果您想将一个命令的标准输出转换为第二个命令的参数,xargs
可以做到