![在标准输入上打印给定文件名的文件内容的命令](https://linux22.com/image/60150/%E5%9C%A8%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E4%B8%8A%E6%89%93%E5%8D%B0%E7%BB%99%E5%AE%9A%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我有一个命令可以生成一些输出部分,其中实际上是包含完整输出数据的文件名。我想提取文件名(我通常使用cut
),然后将其传递给另一个程序,例如cat
它将显示该文件的内容。
我无法分享我正在运行的实际命令,但为了重现性,您可以替换./my-command args
为echo 1:2:3:4:file.txt
所以我尝试了以下方法:
./my-command args | cut -d : -f 5 | cat
然而,这只是打印文件名,因为cat
在没有任何参数的情况下调用它时,只是将 stdin (包含我的文件名)的内容复制到 stdout 。
现在我知道我可以通过反转命令流并cat
通过子 shell 传递参数来解决 Bash 的问题,例如
cat `./my-command args | cut -d : -f 5`
这将打印文件的内容,但这不是特别友好,因为我不能通过在调用中附加一个简单的命令来简单地通过管道传输底层命令的输出。
是否有cat
类似的程序可以在标准输入上获取文件名并打印其内容?或者有没有办法cat
将 stdin 视为参数?
笔记
我意识到我可以定义一个 bash 函数,它可以从 stdin 读取文件名并cat
在我自己的环境中调用它们。然而,这种直接转储输出数据的技术需要包含在最终用户文档中,并且非常优选简单的与 shell 无关的方法。
答案1
经过更多研究后,我意识到这种情况正是如此xargs
专为:
./my-command args | cut -d : -f 5 | xargs cat
这会将 stdin 的输出转换为cat
实际文件名的调用,从而打印出文件内容