我有一个文本文件a.txt
hello world
我使用以下命令:
cmd1:
$ more a.txt
output:
hello world
cmd2:
$ echo 'a.txt'|more
output:
a.txt
我认为cmd2应该等于echo 'a.txt'|xargs -i more {}
,但不是。
我想知道cmd2为什么这样工作,以及如何编写在管道模式下工作方式不同的代码。
答案 0 :(得分:1)
使用|
或<
进行重定向控制 stdin流包含的内容;它对程序的命令行参数列表没有影响。
因此,more <a.txt
(有效)或cat a.txt | more
(无效)都附加了一个文件句柄,从中可以将a.txt
的内容读取到新进程的stdin文件句柄中用more
替换该过程。同样,echo a.txt | more
使a.txt
本身成为more
从其stdin流读取的文字文本,这是记录获取输入内容的默认位置从其命令行中显示(如果未提供任何更具体的文件名)。
通常,如果您有一个文件名列表,并且想要将它们转换为命令行参数,这就是xargs
的目的(尽管使用时如果不加注意,可能会引入错误,并可能带来安全性) -令人印象深刻的人。
请考虑以下内容(使用NUL而不是换行符来分隔文件名)是安全使用xargs
来获取要传递到其中的文件名列表,并将其转换为{{ 1}},用于将所有这些文件连接在一起,并生成到cat
的单个输入流:
more