Bash条件ディレクティブの引用符の理解

Bash条件ディレクティブの引用符の理解

私の友人はBashスクリプトを使って遊んでいて、私にそのスクリプトを見てほしいと言いました。 (彼は他の友人にそのスクリプトを代わりにしてもらうように頼んだ。)

if [ "`pidof transmmission-gtk`"=0 ];

`特にpidof自体が二重引用符で囲まれている場合、前の(バックティック)のポイントは正確に何ですか?

ちなみに分散解像度パッケージ用です。私はbashをあまり使用していないので尋ねます。

答え1

バックティックは次のことを意味します。コマンドの置き換え:拡張結果`pidof transmission-gtk`は実行中のコマンドの出力ですpidof transmission-gtk`pidof transmission-gtk`これを書くもう1つの方法$(pidof transmission-gtk)はこの選択肢であり、推奨されます(バックティック自体内のコマンドに引用符が含まれている場合は欠点がなく、問題を回避します)。

二重引用符を使用すると、コマンド置換の結果が別の単語に分割され、ワイルドカードパターンとして解釈されるのを防ぎます。シェルスクリプトを起動した場合は、心配しないでください。コマンド置換の周りに常に二重引用符を入れることを覚えておいてください。変数置換の場合も同様です。たとえば、Always write "$foo"、never plain です$foo

書かれたこのコードは意味がありません。テストには、=0(実行中のプロセスがない場合transmission-gtk)、1234=0(一致するプロセスがある場合)、または123 456=0(スペースが含まれていてもシェル用語として単一の単語)に似た単語が含まれています。 )。テストの個々の単語は常に正しいと見なされます。文字列が他の文字列と同じかどうかをテストするには、次のようにします[ "string1" = "string2" ](角かっこの両側と演算子の両方にスペースが必要です)。数値的等価性をテストするには、true-eqなどの演算子を使用します。[ 1 -eq 01 ]

これには、実行中のプロセスがあるかどうかをテストする2つの方法がありますtransmission-gtk

  • 出力が空であることをテストします。

    if [ -z "$(pidof transmission-gtk)" ]; then …
    
  • 戻り状態がpidof0 でないことをテストして失敗を示します。コマンドの出力は使用されないため、/dev/null(大きな穴)にリダイレクトされます.

    if ! pidof transmission-gtk >/dev/null; then
    

答え2

bash(1)マンページ、拡張部分、コマンドの置き換え部分:

   Command substitution allows the output of a command to replace the com-
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com-
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

[コンクリートブロックほどスマートで空の文字列が好きではないので引用します。

関連情報