データ検証のためにいくつかのawkスクリプトを書いています。これは、コンテンツが有効であることを確認するためにawkスクリプトの終了コードを調べる必要がある他のプロセスによって選択され呼び出されることを目的としています。しかし、終了終了コードを読み取るのに問題があります。
プログラムを再現して実行しようとこのスクリプトを作成しました...
#!/bin/awk -f
BEGIN { exit 1 }
$ ./test.sh ; echo $?
0
私は元の出力が1だと思いました。 awkが間違っていて、私が正しいことをすぐに疑い、次のことを試しました。
$ awk 'BEGIN { exit 1 }' ; echo $?
1
したがって、awkの終了はsemが私が望むことを行いますが、shebangスクリプトで実行するときはそうではありません。
次に、次のことを試してください。
#!/bin/env awk -f
BEGIN { exit 1 }
$ ./test.sh ; echo $?
0
/bin/env: awk -f: No such file or directory
できますが…
#!/bin/sh
awk 'BEGIN { exit 1 }'
$ ./test.sh ; echo $?
1
その後、viでスクリプトのすべての構文強調/操作(最大200行)をオフにしました。
別のオプションは次のとおりです。
#!/bin/sh
awk -f $1
exit $?
ただし、これを行うには、awkスクリプトパスを管理して実行可能ファイルをラップする必要があります(bashの場合にのみ$ {BASH_SOURCE [0]})。
理想的には「-W posix」オプションをawkに設定したいのですが、そうすればはるかに複雑になります!
修正する
OpenSuse 13 / awk 4.1.0で上記の最初のスクリプトを実行すると、期待した結果が得られます(悲しいことに、実際には問題は解決されません)。
ベストアンサー1
実行中のOSや使用しているawkのバージョンについては言及していませんが、GNU awk(4.1.1)を使用してLinuxホストで問題を再現しようとしたときにうまくいきました。一方:
#!/bin/awk -f
BEGIN { exit 1 }
ファイルに入れると、test.sh
次のような結果が表示されます。
$ ./test.sh
$ echo $?
1
test.sh
私はこれがスクリプトの奇妙な名前であると述べたコメントのコメントに同意しますawk
。.awk
実際にはシェルスクリプトではないことを明確にするために拡張機能を使用します。
修正する
RHEL 6.7:
$ rpm -q redhat-release-server
redhat-release-server-6Server-6.7.0.3.el6.x86_64
awkを使用してください:
$ awk --version
GNU Awk 3.1.7
すべてが大丈夫に見えます。スクリプト:
$ cat test.awk
#!/bin/awk -f
BEGIN {exit 1}
結果:
$ ./test.awk
$ echo $?
1