为什么在管道模式下不能将文件路径参数传递给shell命令“更多”?

时间:2019-10-16 15:47:06

标签: linux shell pipe pipeline

我有一个文本文件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为什么这样工作,以及如何编写在管道模式下工作方式不同的代码。

1 个答案:

答案 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