이 경우 /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

2. -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 라인을 얻습니다 ). 이식성이 없기 때문에 .#!/bin/shawk/bin/usr/bin/usr/xpg4/bin/awk/usr/bin#!/usr/bin/env awk -f#!/bin/sh/bin/sh다국어sh즉, awk를 실행하라는 명령으로 해석되는 스크립트와 awk가 필수 스크립트로 해석되는 것입니다. 이는 shshebang 라인을 인식하지 못하지만 기본적으로 스크립트를 실행하는 시스템(일부 골동품 unice 또는 유닉스가 아닌 커널의 일부 유닉스 계열 사용자 영역) 에서도 작동합니다 .

#!/bin/sh
"exec" "awk" "-f" "$0" "$@" && 0 {}
… # awk script here

(고대 유니티의 이식성에 대해 우려한다면 다음을 참조하세요.Sven Maschek의 페이지지원 "$@"하고 사용을 고려하십시오 ${1+"$@"}. )

관련 정보