【问题标题】:Terminal shell: How to use echo instead of a text file as command-line arguments终端外壳:如何使用 echo 而不是文本文件作为命令行参数
【发布时间】:2023-03-03 17:27:02
【问题描述】:

我有一个命令行实用程序,它需要一个文本文件(用于格式化输出)作为参数。我只需要纯值,不需要格式化,所以我想有一个单行脚本来获取值。

文本文件template.file只包含:

$1

这是我的实用程序的一个示例:

vclient -h 10.0.0.131:3002 -t template.file -g getTempKist

我想要的是这样的:

vclient -h 10.0.0.131:3002 -t $(echo '\$1') -g getTempKist

有谁知道如何使用echo(或替代方法)的结果而不是外部文本文件?

希望有人能帮忙。

马库斯

【问题讨论】:

  • 您可以适当地使用标准输入:echo '$1' | vclient -h 10.0.0.131:3002 -t - -g getTempKist

标签: bash shell terminal command-line-arguments home-automation


【解决方案1】:

你可以尝试两件事:

首先,您可以像这样使用标准输入:

echo '$1' | vclient -h 10.0.0.131:3002 -t - -g getTempKist

一些工具支持文件名参数的特殊值-,其中- 代表标准输入。但是,这取决于命令的实现。

如果您的 shell(如 bashzsh)支持,您可以使用的第二件事是使用 process substitution

vclient -h 10.0.0.131:3002 -t <(echo '$1') -g getTempKist

【讨论】:

  • 好的,我试过了,但工具只是挂起。所以这可能没有在工具本身中实现。
  • 是的,看起来不是。然后你可以使用第二种方法。
  • 您的操作系统/文件系统可能有/dev/stdin 可用于代替- 作为-t 的参数。
  • @chepner 不错!例如,如果您知道操作系统是 Linux,但您不能依赖支持进程替换的 shell - 那么使用 /dev/stdin 看起来是在 shell 脚本中使用的最便携的方法。
  • 我现在这样使用它,现在包装在一个脚本文件中,所以我可以用参数调用它并重用它:/bin/bash -c "/usr/bin/vclient -h 10.0.0.131:3002 -t &lt;(echo '\$R1') -c $1"
【解决方案2】:

如果您尝试使用echo 来避免创建临时文件,那么您可能更愿意尝试看看是否可以直接粘贴到stdin。许多工具都支持这一点:

$ cat foo.json 
[1,2,3]

$ python -m json.tool foo.json 
[
    1,
    2,
    3
]

$ python -m json.tool /dev/stdin
[1,2,3]  <-- Paste this into the terminal then press Ctrl-D
[
    1,
    2,
    3
]

因此,对于 OP 中的工具:

$ vclient -h 10.0.0.131:3002 -t /dev/stdin -g getTempKist
\$1  <-- Paste this into the terminal then press Ctrl-D

【讨论】:

    【解决方案3】:

    使用 ` 包围的命令(抱歉,代码格式给我带来了这些字符的麻烦)首先评估命令的结果,所以用 ` 包围你的 echo 可能会起作用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多