$が返されるのはなぜですか?このスクリプト内で実行すると違いはありますか? [コピー]

$が返されるのはなぜですか?このスクリプト内で実行すると違いはありますか? [コピー]

私のスクリプトには次のものがあります。

connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")

コマンドを受け取り、コンピュータで手動で実行すると、予期した終了コードが表示されます。ただし、スクリプトが実行されるたびに生成される終了コードは次のとおりです。いつも0.

終了コードが常にゼロを返すのはなぜですか?

答え1

予期しない戻り状態を受け取る理由は、リモートホストへのコマンドの引用によるものです。

次の2つの声明を考慮し、対照してください。

a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'

最初のケースでは、"... $a"評価今後コマンドを実行すると、ssh次の有効な状況が発生します。

ssh remotehost "a=banana; echo apple"

2番目のケースでは'... $a'合格文字通りの意味で実行のためにリモートホストに接続すると、次の有効な状況が発生します。

ssh remotehost 'a=banana; echo $a'

これはまさにあなたのものです$?。二重引用符で囲まれているため、コマンドを実行する前に評価されます。 0の値は前のコマンドからのものなので、どうすればよいですか?効果的に実行すると、次のようになります。

connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")

必要なのは、単一引用符を使用して、ローカルシェルがそれをリテラルとして処理するようにすることです。次のようになります。

connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')

たとえば、2つの部分で構成される文字列は"hello"'world'単一の値に連結されますhelloworld。最初の部分は変数評価を実行しますが、2番目の部分は実行しません。

関連情報