
나는 읽었다또 다른 대답내가 제공하는 것보다 통역사에게 인수를 전달할 수 없습니다 /usr/bin/env
.
또 다른 잠재적인 문제는 이
#!/usr/bin/env
트릭을 사용하면 인터프리터에 인수를 전달할 수 없다는 것입니다(암시적으로 전달되는 스크립트 이름 제외).
그러나 다음을 사용하는 동안 awk
플래그를 지정하지 않으면 문제가 발생 -f
하고 플래그를 지정하면 수정되기 때문에 가능한 것 같습니다 .-f
/usr/bin/env
먼저, 플래그 없이 -f
:
$ cat wrap_in_quotes
#!/usr/bin/env awk
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
awk: syntax error at source line 1
context is
>>> . <<< /wrap_in_quotes
awk: bailing out at source line 1
둘째, 플래그 를 사용하여 -f
:
$ vim wrap_in_quotes
$ cat wrap_in_quotes
#!/usr/bin/env awk -f
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
"foobar"
- 따라서 만약에 따르면연결된 답변플래그를 통역사에게 전달할 수 없습니다. 플래그를
-f
에 전달할 수 있는 이유는 무엇입니까awk
?
나는 뛰고있어 macOS
:
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.1
BuildVersion: 16B2657
답변1
일부 Unices, 특히 macOS(및 2005년까지 FreeBSD)에서는 이를 허용하지만 Linux에서는 허용하지 않습니다.
GNU coreutils 패키지(8.30+)의 최신 릴리스에서 유틸리티를 사용하는 경우 한 줄 에 여러 인수를 제공할 수 있는 env
비표준 옵션이 있습니다 .-S
#!
반대 질문:Linux에서 `#!/usr/bin/env 명령 --argument`를 사용하는 Shebang 라인이 실패합니다.
답변2
당신은 할 수 없습니다휴대 가능인터프리터에 여러 인수를 전달합니다. 특히 리눅스에서는 이를 지원하지 않습니다.
일부 Unix 변형은 shebang 라인에서 둘 이상의 인수를 지원합니다. 이는 최신 macOS 시스템 및 기타 시스템의 경우입니다. 보다Sven Mascheck의 쉘 이식성 페이지한 동안Unix 변형 비교표그리고 많은 역사적 정보.
이식 가능한 awk 스크립트를 갖고 싶다면 깔끔한 해결책이 없습니다. 실제로 이식 가능한 유일한 shebang 라인입니다. Unix 변형에 따라 #!/usr/bin/env
또는 에 있거나 다른 위치에 있을 수 있습니다 (예: Solaris에서는 POSIX를 얻으려면 — in은 레거시 응용 프로그램을 위한 것입니다). 이식 가능하게 작동하지 않으므로 . ( 현대 POSIX 쉘이 아닌 레거시 Bourne 쉘일 수 있지만 모든 Unix 플랫폼에는 실제로 뭔가가 있습니다.) 아이디어는 다음을 작성하는 것입니다.#!/bin/sh
awk
/bin
/usr/bin
/usr/xpg4/bin/awk
/usr/bin
#!/usr/bin/env awk -f
#!/bin/sh
/bin/sh
다국어sh
, 즉 awk를 실행하라는 명령으로 해석하고 awk가 원하는 스크립트로 해석하는 스크립트입니다 . 이는 shebang 라인을 인식하지 못하지만 기본적으로 sh
스크립트 실행을 위해 사용되는 시스템(일부 골동품 유닉스 또는 유닉스가 아닌 커널의 일부 유닉스 계열 사용자 영역)에서도 작동합니다.
#!/bin/sh
"exec" "awk" "-f" "$0" "$@" && 0 {}
… # awk script here
(고대 유니스로의 이식성이 문제라면 다음을 참조하세요.Sven Mascheck의 페이지지원을 받고 대신 "$@"
사용을 고려해 보세요 ${1+"$@"}
.)