if $( ssh user@host " [ -e file ] " ) の "if $" とはどういう意味ですか?それから…​​?

if $( ssh user@host " [ -e file ] " ) の "if $" とはどういう意味ですか?それから…​​?

スクリプトのステートメントでは、条件がifaを使用しているのを見ますが、$ その理由を理解できません。

if $( ssh user@host " test -e file  " ); then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi

答え1

$(...)コマンドの置換です。シェルは埋め込みコマンドを実行し、式はコマンドの標準出力に置き換えられます。

通常、代替テキストにシェルが後で実行できるコマンドの名前が指定されていない場合、エラーが生成されます。ただし、test出力は生成されないため、結果はシェルが「スキップする」空の文字列です。たとえば、次を実行するとどうなるか考えてみましょう。

if $( ssh user@host " echo foo " ); then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi

与えられたコードは、不要なコマンドの置き換えなしで正しく書かれています。ifステートメントに必要な唯一のものは、コマンドの終了状態です。

if ssh user@host "test -e file"; then 
   echo "File is there"
else
   echo "We don't that file on that host"
fi

答え2

この$( ... )設定はコマンドを実行し、コマンドの終了ステータスと出力を文字列として返します。これはbacktickの最新バージョンです`...`

次のように使用できます。my_id=$(id)

ただし、公開したコードスニペットは破損したコードです。ssh user@host "test -f file"リモートホスト上のファイルの存在に基づいてブール値を返すように見える結果を使用します。残念ながら、それssh自体が失敗する可能性があることは考慮しません。

if $(ssh -q localhost true); then echo YES; else echo NO; fi
YES

if $(ssh -q localhost false); then echo YES; else echo NO; fi
NO

if $(ssh -q nowhere true); then echo YES; else echo NO; fi
ssh: Could not resolve hostname nowhere: Name or service not known
NO

たぶんこれは意図的な行動かもしれませんが、それは疑わしいです。

さらに$( ... )、重複しているので、条件を直接的に表現することができます。

if ssh -q user@host "test -e file"; then 
   echo "File is there"
else
   echo "We don't [see] that file on that host [or the ssh failed]"
fi

答え3

これを$(command)コマンド置換と呼びます(POSIX仕様を参照)。ここそしてバッシュマニュアルここ)。これはコマンドを実行し、その出力を別のコマンドに渡す方法です。同じ `command`ですが、この$(...)構文は、コマンドをネストしやすく、読みやすいコードを生成するので好ましい。

たとえば、

$ echo $(echo "bar")
bar

上記のコマンドはecho "bar"(つまりbar)の出力を外部にパイプしますecho

関連情報