我可以在命令之间传递文件吗?

我可以在命令之间传递文件吗?

我正在寻找一种将生成的文件从一个命令发送到另一个命令的方法,因此我不必在两者之间在磁盘上保存副本。例如,如果我rar在磁盘上有 ed 文件并且想要打开它们,我希望能够运行如下命令:

unrar x file.rar | kplayer

unrar x file.rar | gpg -c

gpg file.gpg | kplayer 

我确信您明白我在寻找什么。我试图unrar发送到标准输出,-p但它只会将其发送到屏幕,即使我认为它应该与|kplayer 连接。我想这是因为 kplayer 无法从标准输入获取数据。

但是有没有一种方法可以传递文件而不将它们保存在磁盘上?这是我能在内存中创建文件系统并使用它的最好方法,但我不喜欢保留那么多内存的想法。

答案1

许多命令都有写入的选项STDOUT。例如,Unrar 就有这个p选项。许多命令都有-可以结合使用来读取的选项STDIN。所以你给出的第一个例子可以重写如下:

unrar px file.rar | kplayer -

默认情况下,GPG 已经可以使用管道输入:

unrar px file.rar | gpg -c

检查命令的帮助和/或手册/信息页面是否支持将结果发送到STDOUT(许多命令默认执行此操作)。

答案2

如果该命令仅需要文件名,请指定/dev/stdin/dev/fd/0。这些是特殊文件;打开它们实际上复制了标准输入。有些命令-也接受标准输入的别名。

unrar p foo.rar somefile | somecommand -
unrar p foo.rar somefile | somecommand /dev/stdin

有时,程序会对文件名施加限制,通常需要特定的扩展名。您也许可以用符号链接来欺骗它。

ln -s /dev/stdin myfile.ext
unrar p foo.rar somefile | somecommand myfile.ext

这并不总是有效,因为某些程序无法处理管道输入:它们需要可查找的文件,即可以随意来回移动的文件。在这种情况下,您需要创建一个临时文件。

在某些情况下,您可以安排数据显示为常规文件而不是命令的输出。保险丝特别是,可以使各种内容显示为常规文件。例如,与AVFS,存档成员显示为文件。

mountavfs
cd "~/.avfs$PWD/foo.rar\#"
somecommand somefile

答案3

如果您使用的 shell 支持流程替代,这可能有助于无法从标准输入获取数据的程序。

你会做kplayer <(unrar p file.rar)

如果你非常绝望,你可以使用内存盘,并实际创建文件,但它们不会在磁盘上。

答案4

感谢大家的意见,我想没有任何简单的方法可以得到我想要的;(

以下命令应该执行并使用 /dev/shm,所以我需要构建一个漂亮的脚本:)

cp file.gpg /dev/shm && gpg -c file.gpg && rm file.gpg && kplayer file && rm file

相关内容