デプロイスクリプト:Shebangで/bin/gawkまたは/usr/bin/gawkを使用する必要がありますか?

デプロイスクリプト:Shebangで/bin/gawkまたは/usr/bin/gawkを使用する必要がありますか?

gawkは通常/binまたは/usr/binにありますか?同意します#!/usr/bin/env gawkが、パラメータは使用できません。今はを使用しています#!/bin/gawk -f。スクリプトは非常に長く、一重引用符がたくさん含まれており、標準入力で動作します。

GNU Awk マニュアルでは1.1.4 実行可能なawkプログラム例では #!/bin/awk を使用していますが、次のように言います。

多くのシステムでは、inの代わりにawkinを見つけることができます。警告事項/usr/bin/bin

ほとんどの人は何をしますか?私は読んだsedは/ binで標準化されていると推定されます。そしてPerlは/ usr / binで標準化されていると推定されています(sedリンクと同じページですが、この投稿への3番目のリンクを作成することはできません)。 awk/gawkはどうですか?どちらがより一般的で人気があるかを知っている人はいますか?

答え1

これはコマンドに引数を渡す必要がない場合に#!/usr/bin/env gawk機能しますが、多くのカーネル(Linuxを含む)はshebangプログラムに単一の引数しか受け入れません。

それ以外の場合は、次のことができます。多言語このプログラムはシェルラッパーであり、awkスクリプトです。これはawkのためのものです。

#!/bin/sh
true + /; exec gawk -f "$0"; exit; / {}
# awk script starts here

シェル分析:

  • true + /;- 2つの遅延引数true(何もしません)+/
  • これは、改行gawk文字を含まず、スラッシュで書かれたすべてのシェルの断片である可能性があります\/(シェルが気にしない内部引用符を除く)。
    この呼び出しは、execgawk を子プロセスとして実行するのではなく、シェルを gawk に置き換えます。
  • exit;- gawkが見つからない場合は、シェルを終了します。シェルが実行を開始する前に行全体を解析しようとすると、有効なシェル構文でない限り、それ以降の内容はすべて無視されます。

奇妙な分析:

  • スラッシュ間のビットは正規表現です。
  • true + /REGEX/- 条件。trueは未定義の変数なので、値はゼロですが関係ありません。
  • {}- 上記の条件がtrueの場合、何もしません。

答え2

Gillesによって提案された解決策は実際には非常に良いアプローチです(最後に彼の投稿で投票という評判を得ました:))。

とにかくコマンドについて私が理解したのは、execシェルexitプロセスですawk

また、スクリプトが呼び出しパラメータにアクセスできるように、提案されたawkソリューションをいくつか変更することをお勧めします。

#!/bin/sh
true + /; exec -a "$0" gawk -f "$0" -- "$@"; / {}
# awk script starts here

-a "$0"スクリプトが呼び出し名にアクセスできるようにします。それ以外の場合は、awk変数にアクセスするときは常にまたはを取得します。同様に、スクリプトが配列の残りのパラメータにアクセスできるようにすることは、スクリプトがパラメータを解釈せずにパラメータを受け取ることを可能にすることです。gawkARGV[0]"$@"ARGV[1...N]---<something>

覚えておくべきことの1つは、スクリプトブロックの末尾にステートメントを追加することですexit(0);。それ以外の場合、脅威はスクリプト内のすべてのパラメータの入力ファイルに渡されます。 (これは私たちが行から削除したステートメントとはまったく関係ありません。これはアクセスできないシェルステートメントであり、提案された終了はawkコードにありました。)BEGIN { ... }awkawkexittrue + ...

答え3

Shebangは最初からそれほど柔軟ではありません。。いくつかの状況があるかもしれません。動作する2番目のパラメータがあります。、私はFreeBSDがその一つだと思います。

gawkとオペレーティングシステムに付属しているほとんどのユーティリティは/usr/bin/

以前のUNIXでは、/usr/ローカルディスクスペースとワークステーションあたりのコストを節約するために、NFSまたはいくつかの安価なメディアを介してインストールするのが一般的でした。/bin/始めるために必要なすべてが必要です。シングルユーザーモード/usr/信頼できるメディアにはインストールされていないため、/bin/一般的な管理とトラブルシューティングに十分にユーザーフレンドリーにするのに十分なユーティリティが含まれています。

これはもともとLinuxから継承されましたが、ディスク容量はもはや問題ではなく、ほとんどの場合ルートファイルシステムにあるため、現在の傾向は(少なくともLinuxの世界では)すべてを/usr/ルートファイルシステムに移動することです。/usr/binしたがって、ディストリビューションでインストールしたほとんどのユーティリティはここにあります。などの最も基本的なユーティリティもありますcp。 (まあ、まだではありません)。rmls

shebangの選択について。従来、これは管理者またはユーザーが環境に応じて編集する必要がある項目です。開発者は、他の人のシステムでは、インタプリタがファイルシステムのどこにでも配置できることを知っています(例:/usr/local/bin/opt/gawk-4.0.1/bin)。適切にパッケージ化されたスクリプト(rpm、debなど)は、デプロイメントパッケージに依存するか(インタプリタに既知の場所があるなど)、インストール中に正しいハッシュバンを設定する設定スクリプトがあります。

答え4

最新のcoreutils(IIUC 8.30+)がインストールされている場合は、次のものを使用できます。

#!/usr/bin/env -S gawk -f

すべてのオプションはenvにパラメータとして渡され、分割されます。

関連情報