【问题标题】:Why does "bash -c 'echo $hiveURI" show a value while "ssh host 'bash -c echo $hiveURI'" shows nothing?为什么“bash -c 'echo $hiveURI”显示一个值,而“ssh host 'bash -c echo $hiveURI'”什么也没显示?
【发布时间】:2023-04-02 17:15:01
【问题描述】:

我有一个程序在主机上运行时可以运行,但在通过 ssh 运行时失败,因为没有设置环境变量。

此变量在/etc/environment 中设置为export hiveURI=connectstring

以下所有返回connectstring

echo $hiveURI
bash -c 'echo $hiveURI'
sh -c 'echo $hiveURI'
ssh host 'echo $hiveURI'

但以下命令返回 null:

ssh host 'bash -c echo $hiveURI'
ssh host 'sh -c echo $hiveURI'

我无法控制远程调用程序的方式,但我怀疑它是最后两个之一。

发生了什么,我该如何解决?

更新:

如下所述,我应该使用更多的引号。最后两个命令,正确引用,返回connectstring。所以,这个问题已经回答了,但我的问题仍然存在。感谢您的意见。

【问题讨论】:

  • bash -c echo $hiveURI 永远不会工作;它需要更多报价。它将echo 视为一个脚本来运行任何hiveURI 扩展为作为参数传递给该脚本的脚本......但是脚本echo 根本不会读取它的参数,所以即使值在那里,它会被忽略。
  • 我建议从ssh host env 开始,以确保在远程系统上真正设置了变量。
  • 如果可行,下一个开始的地方是ssh host $'bash -c \'echo $hiveURI\''
  • 虽然根本没有理由使用bash -cssh host somecommand arg1 arg2 ... 总是 隐式地在host 上启动sh -c 'somecommand arg1 arg2 ...'
  • ...所以ssh host 'bash -c echo $hiveURI' 在远程主机上开始(以JSON 语法)["sh", "-c", "bash -c echo $hiveURI"]bash -c echo $hiveURI 如果你在没有 ssh 的情况下在本地运行它,同样的方式会失败,顺便说一句。

标签: bash environment-variables


【解决方案1】:

bash-c 选项只接受一个参数。所以

bash -c echo $hiveURI

只使用echo 作为-c 的参数,而不是echo $hiveURI。您需要将其放在引号中以将变量包含在命令中,就像您直接在主机上运行 bash -c 'echo $hiveURI' 时所做的那样。

ssh host 'bash -c "echo $hiveURI"'

【讨论】:

  • 请注意,由于 ssh host 隐式运行 sh -c 并传递给它的其他参数的串联,sh -c 'bash -c "..."' 是愚蠢的(当不使用仅 bash 的语法或实用程序时)。
  • 没错,这就是ssh host 'echo $hiveURI' 起作用的原因。在某些情况下,您可能需要显式使用bash -c,可能是在删除服务器上设置了一些其他变量之后。 ssh host 'var=$(something); bash -c "$var something else"'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2022-12-10
相关资源
最近更新 更多