欺骗Unix命令行程序接受文件流

时间:2010-03-09 05:43:39

标签: pipe unix

假设情况。我在* nix(linux,BSD等)中有一个命令行程序。编写它是为了传递一个文本文件作为参数

$ program file.txt

运行该程序,它会查看file.txt中的文本。

是否有可能“欺骗”此程序接受来自文件流的输入而不是通过磁盘读取文件?我非常习惯使用unix管道去这些东西,但是对于它们的内部构件仍然有点神秘,因此我无法(肯定地)对上述问题说“是”。

4 个答案:

答案 0 :(得分:4)

bash可以让你这样做:

program <(otherprogram)

这使用otherprogram的输出作为传递给program的文件的内容。

答案 1 :(得分:3)

您可能对named pipes感兴趣:

mkfifo myPipe
program myPipe &
anotherProgram > myPipe

相当于:

anotherProgram | program

答案 2 :(得分:1)

如果您的program未编码为接受标准输入,即使您使用命名管道或进程替换,它也无法工作

答案 3 :(得分:0)

除了其他答案的shell管理技巧之外:

某些unix系统具有特殊文件/dev/stdin,您可以运行例如。

otherprogram | program /dev/stdin

其他(例如linux)可能有/proc/self/fd/0,可能会以相同的方式使用。

如果在打开命令行上的文件之前关闭stdin,这两个都将失败,但这种情况极为罕见。它更有可能失败,因为程序期望文件seek(),这对管道不起作用。

如果你的shell是zsh,你还有另外一个选择。

program =(otherprogram)

在设置临时输入文件并在program终止后将其删除时,这将完成所有工作。这适用于seek(),但可能暂时占用更多空间。