私は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 --version
nixos 19.09のawkバージョン5.0.1と言います。
/usr/bin/env
nixosファイルは従来の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
。