BEGIN:ソーシングで実行すると、単純なawkスクリプトでコマンドが見つかりません。

BEGIN:ソーシングで実行すると、単純なawkスクリプトでコマンドが見つかりません。

私はawk今日学んでいますが、最も簡単なスクリプトをうまく機能させることはできません。

#!/usr/bin/env -S awk -f
BEGIN { }
{ }
END { }

この出力BEGIN: command not found

でも

#!/usr/bin/env -S awk -f
{}

この出力{}: command not found

実行時に$ /usr/bin/env -S awk -fデフォルト出力を表示するawk実行可能ファイルがあります。

$ awk --versionnixos 19.09のawkバージョン5.0.1と言います。

/usr/bin/envnixosファイルは従来のFHSディレクトリ階層に従わないため、nixosを使用する必要があります。

私は明らかなものを見逃していると思いますが、awkのチュートリアルとSOの質問を見ても、まだ何の手がかりも得られませんでした。

編集:スクリプトの起動に使用するコマンドライン

ls -l | . testawk.sh

答え1

調達はいいえ、同じです。実装する。特に、ソーシングには現在シェルで実行できるコマンドのリストが必要です。以下はbashからのものですhelp .

.: .ファイル名[パラメータ]

現在シェルのファイルにあるコマンドを実行します。

現在のシェルのFILENAMEからコマンドを読み取り、実行します。 $ PATHのエントリは、FILENAMEを含むディレクトリを見つけるために使用されます。 ARGUMENTS が指定された場合、FILENAME の実行時に位置引数になります。

したがって、を実行すると、. fileシェルはファイルを読み取り、見つかったすべてのコマンドを実行します。しかし、これはshebang行が無視され、一般的なコメントとして扱われることを意味します。したがって、awk以外のシェルがBEGIN

これを防ぐには、スクリプトをインポートする代わりにスクリプトを実行する必要があります。何らかの理由で、〜しなければならないこれを行うには、スクリプトにawkコマンドを作成します。

awk '
BEGIN { }
{ }
END { }'

だから、あなたはできます

ls | . ./a.awk 

なぜあなたがこれをしたいのかは本当にわかりませんが。


ちなみに、.基本的に(またはbashで)sourceファイル内のファイル名を見つけることに注意してください。$PATHしたがって、実行. fooしてfoo現在のディレクトリにファイルがあり、任意のfooディレクトリにファイルがある場合、インポートするファイル$PATH$PATH現在のディレクトリのファイルではなく、にあるファイルです。これを避けるために、ソーシング時に常にフルパスを使用してください. ./foo

答え2

Shebangを使用してawkを呼び出さないでください。これは、スクリプトパラメータをシェルで実行する必要がある部分とawkで実行する必要がある部分に分割し、awkパラメータをawk変数の割り当てから分離する機能を失うためです。次のようにスクリプトを作成します。

#!/usr/bin/env bash

/usr/bin/env awk '
BEGIN { }
{ }
END { }
' "$@"

場合によっては、awk変数の設定などの操作を実行するためにこれを変更したい場合があります。

#!/usr/bin/env bash

rs="$1"
fs="$2"
shift 2

/usr/bin/env awk -v RS="$rs" -F "$fs" '
BEGIN { }
{ }
END { }
' "$@"

これは上記のように簡単なはずですが、shebangを使用してawkを呼び出す場合はこれを行うことはできません。

答え3

AdminBeeのコメントで述べたように、スクリプトの呼び出し方法(コンテンツのインポート)が正しくありません。

正しいアプローチは次のとおりです。

ls -l | ./test.awk

あるいは、より簡単には、その#!行に依存せずに次のようになります。

ls -l | awk -f ./test.awk

関連情報