ssh 和 bash 运行命令的奇怪语法

ssh 和 bash 运行命令的奇怪语法

我对 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;

相关内容