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

发布于 2024-08-24 08:20:28 字数 274 浏览 5 评论 0原文

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

$ program file.txt

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

是否有可能“欺骗”该程序接受来自文件流的输入而不是通过磁盘读取文件?我很习惯使用unix管道来东西,但是它们的内部结构仍然有些神秘,所以我不能(明确地)对上述问题说是或不是。

Hypothetical situation. I have a command line program in *nix (linux, BSD, etc.). It was written so that you pass it a text file as an argument

$ program file.txt

Run the program, it looks at the text in file.txt.

Is it possible to "trick" this program into accepting input from a file stream rather than reading a file via disk? I'm pretty comfortable using unix pipes to do stuff, but there's still something a little mysterious about their internals that make it so I can't say (definitively) yes or not to the above question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

心清如水 2024-08-31 08:20:28

bash 允许您执行此操作:

program <(otherprogram)

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

bash lets you do this:

program <(otherprogram)

This uses the output of otherprogram as the contents of a file passed to program.

守不住的情 2024-08-31 08:20:28

您可能对命名管道感兴趣:

mkfifo myPipe
program myPipe &
anotherProgram > myPipe

相当于:

anotherProgram | program

You may be interested in named pipes:

mkfifo myPipe
program myPipe &
anotherProgram > myPipe

is equivalent to:

anotherProgram | program
时光清浅 2024-08-31 08:20:28

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

if your program is not coded to accept standard input, it won't work even if you use named pipes or process substitution

魔法少女 2024-08-31 08:20:28

除了其他答案的 shell 管理的诡计之外:

一些 UNIX 系统有特殊文件 /dev/stdin,你可以运行例如

otherprogram | program /dev/stdin

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

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

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

program =(otherprogram)

这将完成设置临时输入文件并在程序终止后删除它的所有麻烦。这将与 seek() 一起使用,但可能会暂时占用更多空间。

In addition to the shell-managed trickery of the other answers:

Some unix systems have the special files /dev/stdin, and you can run e.g.

otherprogram | program /dev/stdin

Others (e.g. linux) may have /proc/self/fd/0 which may be used the same way.

Both of these will fail if stdin is closed before the file on the command line is opened, but this will be an extremely rare occurrence. Much more likely will be it failing because the program expects to seek() the file, which does not work on pipes.

If your shell is zsh, you have another option.

program =(otherprogram)

Which will do all the bother of setting up a temporary input file and removing it after program terminates. This will work with seek(), but may temporarily take more space.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文