我正在寻找一种将生成的文件从一个命令发送到另一个命令的方法,因此我不必在两者之间在磁盘上保存副本。例如,如果我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
答案4
感谢大家的意见,我想没有任何简单的方法可以得到我想要的;(
以下命令应该执行并使用 /dev/shm,所以我需要构建一个漂亮的脚本:)
cp file.gpg /dev/shm && gpg -c file.gpg && rm file.gpg && kplayer file && rm file