私はシェル/バッシュスクリプトに初めてアクセスし、かなり退屈な作業を自動化するために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
Enterキーを押したかのように出力が表示されます(したがって使用法について)。
削除するとうまくいきbash -c
ますが、何らかの理由で
ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"
この関数をlocalhostで実行しようとすると奇妙な出力が発生するため、これを行うことです。 SSH接続を終了する前に、リモートホストで複数のコマンドを実行する必要があります。
ありがとうございます!
答え1
ssh user@otherHost "output=$(/usr/local/bin/ascript --FlagToDoSomething; echo \$output)"
それでは、正確に何をすべきですか? $output
echoがにあるので、まだ設定されていません$(command substitution)
。
また、$()
二重引用符内のシェルにも拡張されます。これがローカルで実行される理由です。これを防ぐには、一重引用符を使用してください。
おそらくあなたは欲しいでしょう
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;