PerlとRubyはexit
実際に終了しました。
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
しかし、Awkの場合はそうではありません。
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
"help.awk"を使用してこの問題を解決しようとしました。
function really_exit() {
IM_SURE = 1
exit
}
END {
if (IM_SURE) {
exit
}
}
しかし、これはそれ自体で問題を引き起こします。 "prog.awk"に開始ブロックのみがある場合:
BEGIN {
print "start"
}
次に実行します。
awk -f help.awk -f prog.awk
入力を待っている間中断されます。実際にAwkスクリプトを終了するより良い解決策はありますか?
ベストアンサー1
awkプログラムに「中」またはブロックがある場合は、入力END
を読み込みます。空の入力を提供することでこの問題を解決できます。
$ cat prog.awk
1
END {
print "fin"
}
$ awk -f prog.awk /dev/null
fin
これがデフォルトになるようにするには、「help.awk」にブロックを追加できます。
BEGIN {
if (ARGC == 1 && !system("[ -t 0 ]")) {
ARGV[ARGC++] = "/dev/null"
}
}
ただし、これにより重要な変更が発生します。ダッシュを追加しないと、awk は端末からデータを読み込みません。
awk -f help.awk -f prog.awk -
または「prog.awk」を編集してください。
getline < "-"
入力例を読む:
$ cat prog.awk
/4/ {
really_exit()
}
1
END {
print "fin"
}
$ seq 10 | awk -f help.awk -f prog.awk
1
2
3
入力を読み取らない例:
$ cat prog.awk
BEGIN {
print "start"
really_exit()
}
END {
print "fin"
}
$ awk -f help.awk -f prog.awk
start