![당황스러운 awk 종료 코드](https://linux55.com/image/70944/%EB%8B%B9%ED%99%A9%EC%8A%A4%EB%9F%AC%EC%9A%B4%20awk%20%EC%A2%85%EB%A3%8C%20%EC%BD%94%EB%93%9C.png)
데이터 유효성 검사를 위해 몇 가지 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