이 경우 /usr/bin/env에 인수를 전달할 수 있는 이유는 무엇입니까?

이 경우 /usr/bin/env에 인수를 전달할 수 있는 이유는 무엇입니까?

나는 읽었다또 다른 대답내가 제공하는 것보다 통역사에게 인수를 전달할 수 없습니다 /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/shawk/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+"$@"}.)

관련 정보