Bash(1行):最初のコマンドが成功した場合は2番目のコマンドを実行し、それ以外の場合は3番目のコマンドを実行しますか?

Bash(1行):最初のコマンドが成功した場合は2番目のコマンドを実行し、それ以外の場合は3番目のコマンドを実行しますか?

SSHを介して2つのコマンドを順次実行したいと思います。対話型シェルはありません。 2番目のコマンドは最初のコマンドが成功した場合にのみ実行する必要がありますが、その行はスクリプト内にあるため、2番目のコマンドがこのように実行されない場合はユーザーフレンドリーなフィードバックを受けたいと思います。その後、スクリプトの残りの部分は引き続き実行される必要があるため、ここではexit待つことはできません。

&&たとえば、ブール演算子を使用して失敗した場合は実行をfoo && barブロックしbar、失敗した場合にのみ実行できることを知っています。ところがお互いにどう似合うかちょっと混乱しますね。foobar || bazbazbar

それらを追加します。

(SSH経由で実行され、インタラクティブシェルは必要ありません)

  1. 実装するfoo
  2. barfoo成功した場合にのみ実行
  3. bazfoo失敗した場合にのみ実行し、実行をブロックします。bar

ssh user@host "foo && bar || baz"

今説明した内容を実行する正しい方法ですか?

答え1

あなたの例を使うfoo && bar || bazbazbar または foo失敗する。あなたの説明によると、これはあなたが望むものではありません。if目標を達成するために、次の説明を使用できます。

if foo; then
    bar
else
    baz
fi

または、一行で書きたい場合は、次のようにします。

if foo; then bar; else baz; fi

答え2

シェルスクリプトの完全な構文はコマンドに提供されていますssh。 (このコマンドはリモートアカウントのデフォルトシェルによって実行されます。ここでは互換性があるとしshます。)

複合コマンドは引用符で囲む必要があります。二重引用符を使用するのは正しいですが、一重引用符はすべてのシェル特殊文字を保護するため、リモートコマンドで重要なシェル構成を使用したい場合は重要です。

もしそうなら、あなたが望むことをする方法は次のとおりです。

ssh user@host 'foo && bar || { echo foo failed >&2; baz; }'

任意に複雑な条件を使用することもできます。

ssh user@host '
    if foo; then
         bar
    else
        echo foo failed >&2
        baz
    fi'

(はい、一重引用符内の複数行の文字列です。)

関連情報