デプロイスクリプト: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の場合、何もしません。

おすすめ記事