私は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
。
答え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