당황스러운 awk 종료 코드

당황스러운 awk 종료 코드

데이터 유효성 검사를 위해 몇 가지 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

관련 정보