AWK를 우회하여 AWK 스크립트에 옵션 전달

AWK를 우회하여 AWK 스크립트에 옵션 전달

순수 AWK 스크립트에 직접 전달되는 AWK 옵션 매개변수를 얻을 수 있습니까?

예시 스크립트:

#!/usr/bin/env -S awk -f
BEGIN { if (ARGV[1] == "-h") print "whoop" }

./myscript -h외침을 인쇄하고 싶습니다 . 그러나 AWK는 -h를 먼저 가져오고 사용법을 인쇄합니다.

실행은 ./myscript -- -h작동하지만 -f로 인해 shebang에서 작동하도록 할 수 없습니다.

대신 AWK와 함께 쉘 스크립트를 사용할 수 있다는 것을 알고 있습니다.

답변1

이 과제를 해결하려면 FreeBSD를 사용하여 수행할 수 있습니다.env또는 GNU를 사용하십시오환경>= 8.30(OP가 이미 가정한 대로) shebang에서:

#! /usr/bin/env -S sh -c 'exec awk -f "$0" -- "$@"'
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
./myscript -h 1 2 3
-h
1
2
3

하지만 이것이 좋은 생각이라는 뜻은 아닙니다.

다음을 시도해 볼 수 있습니다.

#! /bin/sh
BEGIN { 2>"/dev/null"
        exec awk -f "$0" "--" "$@"
}
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }

이것은 BEGIN귀하 의 PATH.

답변2

GNU가 있다면 awk이것을 사용할 수 있습니다

#!/usr/bin/gawk --exec
BEGIN { print "==>",ARGV[1],"<==" }

샘플 사용

./a -h
 ==> -h <==

테스트하지는 않았지만 이 mawk변형은 이를 지원하기 위해 .GNU 주장 -W exec대신 사용하는 것으로 보이지만 .--execgawk#!

관련 정보