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