【问题标题】:Pass contents of file as a string to an argument for another command [duplicate]将文件内容作为字符串传递给另一个命令的参数[重复]
【发布时间】:2022-02-08 01:18:48
【问题描述】:

我有一个这样的 json 文件:

{"my_string": "apple", "my_int": 456}

还有一个像这样可以正常工作的 Bash 程序:

my_program --message='{"my_string": "apple", "my_int": 456}'

但是当我的 JSON 是一个文件时,我似乎无法让它正常运行:

my_program --message=$(cat test_message.json) 

我一直在寻找类似的问题,并尝试了很多东西,例如 tr、awk 以及 echo 和 cat 的各种组合,但无济于事。

这是我收到的错误,让我相信这是我在 Bash 中做错的事情:

ERROR: (gcloud.beta.pubsub.schemas.validate-message) unrecognized arguments:
  "apple",
  "my_int":
  456}
  To search the help text of gcloud commands, run:
  gcloud help -- SEARCH_TERMS

如果您看到它看起来像是分解了 JSON,只取第一个空格之前的字符。有任何想法吗?我有一种感觉,这是非常基本的,但我似乎无法弄清楚。提前谢谢你。

【问题讨论】:

    标签: bash gcloud google-cloud-pubsub command-substitution


    【解决方案1】:

    直接的解决方法是在命令替换周围添加引号:

    my_program --message="$(cat test_message.json)"
    

    另见When to wrap quotes around a shell variable?

    但是,如果您可以控制 my_program,一个更好的解决方法是让它读取标准输入。

    my_program --stdin <test_message.json
    

    如果cat 只是更复杂事物的占位符,请结合管道:

    jq .fnord test_message.json |
    my_program --stdin
    

    (对于这种常见的基本情况,不需要显式选项可能会更好。)

    如果不是很明显,管道是生产者和消费者之间的直接通信线路,而命令替换要求 shell 在传递之前读取所有输出并将其缓冲到内存中。对于任何重要的输出量,这都是低效、不优雅、缓慢且容易出错的。

    【讨论】:

    • 好吧,我现在不觉得自己很愚蠢 - 这确实是一个直接的解决方案。谢谢!
    • 不客气。不要觉得自己很傻,这让很多新人感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多