![ssh 和 bash 运行命令的奇怪语法](https://linux22.com/image/70745/ssh%20%E5%92%8C%20bash%20%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%E7%9A%84%E5%A5%87%E6%80%AA%E8%AF%AD%E6%B3%95.png)
我对 shell/bash 脚本相当陌生,我正在 OSX 上编写一个脚本来自动执行一些相当乏味的工作。我正在尝试使用 . 在远程主机上运行我的脚本的一部分ssh
。两台机器上都有一个通用脚本,我将其称为ascript
.在两台机器上,该脚本都位于 /usr/local/bin 中。
ascript
我知道我需要远程主机上的完整路径才能运行它,如下所示:
ssh user@otherHost bash -c "/usr/local/bin/ascript --FlagToDoSomething"
但是,我发现--FlagToDoSomething
只有在脚本中按以下方式编写时才能正确运行:
ssh user@otherHost bash -c " /usr/local/bin/ascript --FlagToDoSomething"
(即在开放引号后需要换行)我在终端窗口中收到一条消息,内容为bash: -c: option requires an argument
,但其余部分继续运行,并且得到了我期望的输出。如果我不这样做,我只会得到输出,就像我刚刚输入ascript
并按回车键一样(因此是使用信息)。
如果我删除bash -c
它可以正常工作,但我只是这样做,因为无论出于何种原因:
ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"
尝试在本地主机上运行此函数,这会导致一些奇怪的输出。在终止 ssh 连接之前,我需要在远程主机上运行多个命令。
谢谢!
答案1
ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"
那到底应该做什么? $output
尚未设置,因为 echo 位于$(command substitution)
.
另外,$()
由双引号内的 shell 扩展。这就是它在本地运行的原因。使用单引号可以避免这种情况。
也许你想要
output=$(ssh u@oh '/usr/local/bin/ascript --FlagToDoSomething')
答案2
删除“-c”并将整个 shebang 放在引号中:
output=$(ssh [email protected] "bash /usr/local/bin/ascript --testable=fly");
echo $output;