linux 任何一个命令都是调用了一个可执行的程序,比如说 ls -l, ls是一个可执行文件名,-l 是一个该程序运行时候的一个参数
管道和xargs的作用,举个c程序来说如下:
-
void main(int argc, char* argv[]){
-
scanf();
-
return;
-
}
xargs的作用就是提供程序运行时的参数,就是将xargs传递到上述代码的char * argv[ ]
管道的作用就是将前面程序的的输出放到后面程序的标准输入缓存区中,一旦后面的程序要用标准输入scanf 读取的时候就从该缓存区中获取内容,就是传递到上述的scanf()
所以什么时候只用管道,什么时候要加上xargs就是要判断当前传递的东西究竟是作为一个运行时的参数( ps -aux,-aux就是运行时的参数了 ),还是只是作为标准输入提供给程序去处理(比如 grep )
参考博客:http://www.cnblogs.com/wangqiguo/p/6464234.html
https://blog.csdn.net/w1300048671/article/details/71548860
ps: xargs其实本身也是一个程序,当运行参数中没有程序名的时候,xargs会把内容直接输出,不再传递
如:echo '123' | xargs
在一个目录中有如下三个文件
a.c b.c c.c
find . / -print命令会打印出三个文件名
find . / -print | grep a.c 只会打印出a.c这个文件
如果只输入命令grep a.c
那么你在键盘中只输入a.c字符串时,a.c会被打印两次,否则只打印你输入的字符
如果要找三个文件中,那个文件包括有hello字符
find ./ -print | xargs grep hello
总结:管道符后不加xargs相当于先将xargs后面的命令回车执行一下再从键盘里输入
管道符前面命令执行的结果内容
加上xargs 相当于直接从键盘输入管道符前面命令执行的结果内容再回车
再总结一下,就是回车的先后顺序不太一样。