【问题标题】:How to avoid creating tmp-Files on Linux?如何避免在 Linux 上创建 tmp-Files?
【发布时间】:2019-08-09 13:41:48
【问题描述】:

我有一个需要访问文件的程序。这个文件的内容在一个变量中,我想避免创建一个真实的文件。是否可以创建某种虚拟文件??

X='some stuff'
Y='other stuff'
echo $X > some_file
echo "$Y" | command --file some_file -

通常我会将它传递给命令,但 STDIN 已经“使用中”。有没有办法将两个变量都传递给命令,而不创建 tmp 文件?

【问题讨论】:

  • 在这种情况下command 是什么?许多实用程序可以从stdin 读取,这将允许您“管道”数据,例如:echo "${X}" | command --file -
  • 非常感谢 :) 我已经更新了我最初的问题
  • {echo "$X" ; echo "$Y" ; } | command 有帮助吗?祝你好运。
  • 您是否拥有command 的控制权(编辑权限)。您可以添加 env var,如果它有一个值,它将在哪里处理它? cmd_cmd="$Y"; echo "$X" | command,其中command 现在失去了它的环境,如果它找到$cmd_cmd,它将读取它作为输入或将其分配给其他内部变量。只是一个想法。祝你好运。
  • 使用 bash 和其他一些 shell,echo "$Y" | command --file <(echo "$X") - 可以工作。

标签: linux shell file io-redirection virtual-file


【解决方案1】:

标准输入是file descriptor 0,按照惯例,它用于传递“默认”输入。除了标准输入,大多数命令只允许您通过传递文件名来指定输入。

Linux 和大多数其他现代 unice 都有一个“特殊”文件名,表示“此文件描述符上已打开的任何内容”:/dev/fd/<em>N</em>。所以要让command从文件描述符3而不是某个磁盘文件中读取,请传递command --file /dev/fd/3。这适用于大多数命令;此时唯一的障碍是某些命令坚持使用具有特定扩展名的文件名。您通常可以使用符号链接解决此问题。

由于您告诉命令从文件描述符 3 中读取,因此您需要在运行命令时将其打开。您可以打开文件描述符 3 以使用 command --file /dev/fd/3 &lt;some_file 从文件中读取,但如果这样做,您不妨运行 command --file some_file。这很有用的是文件描述符 3 可以来自管道。 shell 中的管道总是将左侧的标准输出连接到右侧的标准输入,但您可以使用file descritor redirection 来移动文件描述符。

echo "$X" | {
  echo "$Y" | command --file /dev/fd/3 -
} 3<&0

在此示例中,整个大括号组的文件描述符 3 从接收$X 的管道读取。因此,当command 从名称传递给--file 的文件中读取时,它会看到X 的值。

这适用于任何 sh 变体。

有一种更简单的语法适用于 bash、ksh 和 zsh:process substitution。下面的代码和上面的代码差不多:

echo "$Y" | command --file <(echo "$X") -

shell 选择一个空闲的文件描述符并创建一个从echo "$X" 到该描述符的管道,并将&lt;(…) 替换为正确的/dev/fd/<em>N</em>

在这两种情况下,传递给--file 的文件都是一个管道。因此,这仅在命令与管道一起使用时才有效。某些命令不适用于管道,因为它们不是从头到尾线性地从文件中读取;使用此类命令,您必须使用临时文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多