命令行中的|和||有什么不同

  • 本文关键字:命令行 shell unix
  • 更新时间 :
  • 英文 :


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上的标准(

这与您通过argvargc访问的命令行参数完全不同。如果您想将一个命令的标准输出转换为第二个命令的参数xargs可以做到

相关内容

  • 没有找到相关文章

最新更新