この「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に対する防御的な事後の考慮です。

答え2

bashとawk(またはgawk)の間には固定関係はありません。ただし、どちらも実行可能なプログラムであり、いくつかのPATHパスに存在する可能性があり、どちらもオープンソースであり、無料でGNUによって開発されました。

GNU 実行可能ファイルは UNIX システムで完全に有効で使用できます。 Solarisシステムでは通常bash(オペレーティングシステムが提供する基本リストに複数回)、大丈夫です。そしてbashはほとんどのPOSIX要件に準拠しています。例:MacOSはPOSIX認証を取得するためにbashを使用します。

LinuxはUNIXの哲学に固執しようとするオペレーティングシステムです。 GNUがGNU is not Unix次のように定義されている唯一の理由は、Linuxが非独占

あなたは言う:awkがUNIXコマンドであることを確認しました。:はい。 Linux命令でもあります。そしてLinuxで使用されるAndroidで数百以上のバージョンオペレーティングシステムすべてが* nixです。返品:Windowsなどはい、WindowsでもUnix層を使用できます。また、GNU awk は *nix システムで最も一般的な awk バージョンです。はい、Windowsは* nixではなく少数のオペレーティングシステムの1つです。

インストールできない理由awkは、一部のシステム開発者がnawk「最良の選択肢」(たとえ類似していても)としてインストールすることを決定できるからですawk。これにより、開発者が作成したコンテンツが破損する可能性があります。awkgawkrbenv

1次のような赤いニシンに陥らないでください。 Linuxただカーネル。一般にLinuxと呼ばれるのは、Linusによって開発されたカーネルと、一般にGNUのオープンソースユーザーツールセットを備えたオペレーティングシステムです。

関連情報