この「bash」スクリプトで「awk」をチェックするのはなぜですか?

この「bash」スクリプトで「awk」をチェックするのはなぜですか?

「rbenv」Rubyバージョンマネージャのオープンソースコードを読んでいましたが、このライブラリのコマンドの1つを見ました。インストールされてgawkいることを確認してくださいawk:

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

しかし、bashファイルの上部にもshebangが表示されます。

#!/usr/bin/env bash

awk最初に、shebangが私たちがスクリプト内で実行されていることを保証したら、それを実行できると仮定できるはずだと思いました。しかし、後でこれがシェルコマンドではなくUNIXコマンドであることがbashわかりました。awkUNIXシステムではない(Windowsなど)文書でこのスクリプトを実行します。 ~からこのリンクgawk、私はこれがUNIXではなくシステムで最も一般的なスタイルであると推測します。awk

awk私たちがインストールされたと仮定できないのは、それがUNIXコマンドであり、UNIXシステムで実行されない可能性があるためです。また、インストールされてgawkいないシステム(UNIXシステム以外のシステムなど)で見つけることができると予想されるawk最も可能性の高い代替項目であるため、確認していますか?

ベストアンサー1

awkたとえば、後でコードでその変数を使用することもできます。"$awk" 'script' fileそれ以外の場合は、書く必要がありますif ! type -p gawk awk >/dev/null 2>&1; then ...error...。その変数を使用している場合は、PATHで最初のgawkまたは他のawkを使用し、変数がない場合は作成できます。awk 'script' filePATHで古いgawkを見逃すこともあります。

ああおおよそそうだ。もう少し見ると彼らのコード:

  awk="$(type -p gawk awk 2>/dev/null | head -n1)"
  if [ -z "$awk" ]; then
    echo "rbenv: cannot find awk" >&2
    return 1
  fi

  # shellcheck disable=SC2016
  "$awk" '
    /^Summary:/ {
      summary = substr($0, 10)
      next
    }

したがって、彼らが本当に望むのは、PATHでawkまたはgawkの最初のバージョンを見つけて使用することです。両方が存在しない場合、失敗するのはIMHOに対する防御的な事後の考慮です。

おすすめ記事