假设情况。我在* nix(linux,BSD等)中有一个命令行程序。编写它是为了传递一个文本文件作为参数
$ program file.txt
运行该程序,它会查看file.txt
中的文本。
是否有可能“欺骗”此程序接受来自文件流的输入而不是通过磁盘读取文件?我非常习惯使用unix管道去做这些东西,但是对于它们的内部构件仍然有点神秘,因此我无法(肯定地)对上述问题说“是”。
答案 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()
,但可能暂时占用更多空间。