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

おすすめ記事