【问题标题】:using a Bash variable in place of a file as input for an executable使用 Bash 变量代替文件作为可执行文件的输入
【发布时间】:2013-01-28 05:01:56
【问题描述】:

我有一个可执行文件,其使用方式如下:

executable -v -i inputFile.txt -o outputFile.eps

为了更高效,我想使用 Bash 变量代替输入文件。所以,我想做如下的事情:

executable -v -i ["${inputData}"] -o outputFile.eps

这里,方括号代表一些聪明的代码。

你知道一些技巧可以让我以这种方式将信息传递到所描述的可执行文件中吗?

非常感谢您的帮助

【问题讨论】:

  • 有点不清楚你想要发生什么。比如,inputData 的值是多少?
  • "${inputData}" 是简单的 ASCII 数据,我想在不实际使用文件的情况下将其“打包”为文件(可能需要存储在非易失性存储器中)。用户 mikyra 提出了一种涉及进程替换的方法,我认为这正是我需要的。感谢您的帮助。
  • 啊,现在我明白了……酷,我不知道。显然这是一个 bash 功能,普通 shdash 不支持,所以最好记住在脚本中使用 #!/bin/bash . +1+1
  • 这一点已得到适当说明。再次感谢!

标签: file pipe bash


【解决方案1】:

您可以使用以下构造:

<(command)

因此,要让 bash 使用命令为您创建一个 FIFO,而不是您尝试的 -i ["${inputData}"],您可以这样做:

-i <(echo "$inputData")

因此,这是您的最终总命令:

executable -v -i <(echo "$inputData") -o outputFile.eps

【讨论】:

  • 这个过程替换正是我所需要的。非常感谢您的帮助!
  • 我遇到了一些需要寻找输入文件的命令,其中fifo管道不起作用。 Zsh 有一个 =() 实现为临时文件,效果很好。
  • 如果inputData 包含文字反斜杠,或者是-e,则会失败
  • 有关在@Eric 提到的情况下有效的解决方案,请参阅here
【解决方案2】:

Echo is not safe to use for arbitrary input.

要正确处理inputdata='\ntest'inputdata='-e'等病理情况,您需要

executable -v -i <(cat <<< "$inputData")

zsh 中,cat 不是必需的


编辑:即使这样也会添加一个尾随换行符。要逐字节输出确切的变量内容,您需要

executable -v -i <(printf "%s" "$inputData")

【讨论】:

    【解决方案3】:

    注意:仅限 zsh:

    要获取包含${variable} 内容的文件名,请使用:

    <(<<<${variable})
    

    注意:

    • &lt;&lt;&lt;${variable} 重定向 STDIN 来自 ${variable}
    • &lt;&lt;&lt;${variable} 等价于(但比)cat &lt;&lt;&lt;${variable}

    所以对于 OP 来说:

    executable -v -i <(<<<${inputData}) -o outputFile.eps
    

    【讨论】:

    • 这也会在variable 的内容之后发出一个尾随换行符,这在大多数情况下并不重要,但可能值得关注
    【解决方案4】:
    executable -v -i <<<"${inputData}" -o outputFile.eps
    

    在 bash 中可以解决问题。

    【讨论】:

    • 这里的字符串&lt;&lt;&lt; 将字符串定向到命令的标准输入。它不会在命令行上放任何东西,也不会让它看起来像要读取的文件。
    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多