最近刚开始学习linux,在学习的过程中发现了一个问题:xargs 和 | 的区别?
在我这个初学者看来,它们俩在字面解释上看是很相似的,| 命令是把前一个命令的标准输出作为后一个命令的标准输入, xargs命令是将标准输入作为后一个命令的参数。百度了一下,发现大家说的对于我来说,理解的有点难。我结合网上的解释,说下自己的理解。
我们先从两个命令看起:
# echo '--help' | cat
# echo '--help' | xargs cat
输出结果:
--help
用法:cat [选项]... [文件]...
将[文件]或标准输入组合输出到标准输出。
-A, --show-all 等于-vET
-b, --number-nonblank 对非空输出行编号
-e 等于-vE
-E, --show-ends 在每行结束处显示"$"
-n, --number 对输出的所有行编号
-s, --squeeze-blank 不输出多行空行
-t 与-vT 等价
-T, --show-tabs 将跳格字符显示为^I
-u (被忽略)
-v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外
--help 显示此帮助信息并退出
--version 显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。
示例:
cat f - g 先输出f 的内容,然后输出标准输入的内容,最后输出g 的内容。
cat 将标准输入的内容复制到标准输出。
将[文件]或标准输入组合输出到标准输出。
-A, --show-all 等于-vET
-b, --number-nonblank 对非空输出行编号
-e 等于-vE
-E, --show-ends 在每行结束处显示"$"
-n, --number 对输出的所有行编号
-s, --squeeze-blank 不输出多行空行
-t 与-vT 等价
-T, --show-tabs 将跳格字符显示为^I
-u (被忽略)
-v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外
--help 显示此帮助信息并退出
--version 显示版本信息并退出
如果没有指定文件,或者文件为"-",则从标准输入读取。
示例:
cat f - g 先输出f 的内容,然后输出标准输入的内容,最后输出g 的内容。
cat 将标准输入的内容复制到标准输出。
......
我们可以看到第一个命令直接打印出来了,第二个命令显示的是cat命令的帮助说明。
# echo '--help' | cat 命令很明显的把字符串 ‘--help’给直接打印出来了,而加了xargs后就相当于 # cat --help 命令,所以 # echo '--help' | xargs cat == # cat --help
我们再看两个命令:
假设在 /home 目录下有 linux目录
test.txt 内容如下:
Learning linux
learning english
现在输入两个命令:
# ls | grep 'linux'
# ls | xargs grep "linux"
结果如下:
linux
test.txt:linux
ls命令是打印出当前目录下的所有文件和目录,它的输出结果是 linux test.txt text1.txt 管道命令将这个输出交给了grep命令 ,从结果分析,管道命令交给grep的输出被当成了文本来处理的。而加了xargs后,管道命令交给grep的输出被xargs以空白符做定界符切分成很多当个的数据,并作为grep的参数来使用,就等于xargs拿到了ls的输出,并且分隔成单个的字符串,然后帮你写下了
# gerp "linux" linux text.txt text1.txt
目前我的理解就是管道命令交给下一个命令的输出会被当做文本被处理,而xargs是会被当做后一个命令的参数