#! / usr / bin / env가“$ @”를 1로 표시하는 이유는 무엇입니까?


0

test.sh가있는 경우 :

#!/usr/bin/env bash
echo "$@"

bash test.sh 결과 1

결과가 1 인 이유가 있습니까? 또한 shebang이 직접 bash 대신 env를 해야하는 이유는 무엇입니까?

업데이트 : 죄송합니다. 이제 코드를 놓쳤습니다.

#!/usr/bin/env bash
main() {
  echo ${1:-1}
}
main "$@"

답변:


0

우분투 18.04.1에서 이것을 재현 할 수 없습니다.

echo "$@"스크립트 외부에서 테스트해야합니다 . 이 표시됩니다 1이전에 입력 한 경우 set 1, 또는 이전 위치 매개 변수의 결과 set명령 (스타트 업 스크립트에 포함).

참고 bash test.sh실행 test.shA와 source( .) 파일 및 모든 #!라인이 무시됩니다. 행동하려면 !#다음이 필요합니다.

bash -c test.sh

이유 env가 지정된 경우 자리 표시 자로 추가되지 않는 한 아무 생각도 없습니다. 하나 이상의 환경 사양을 포함하면 효과가 있습니다. 예를 들어, 다음은 bash사용자 정의 시작 파일로 실행되도록 지정 합니다.

!#/usr/bin/env BASH_ENV=BashStart bash
...

Attie의 답변에 의해 제안 된 또 다른 이유는 OSX bash에서 기본적으로 in /bin/이 아니라 Linux env에서 /usr/bin/와 같기 때문에 Linux 또는 OSX에서 실행되는 스크립트에서 쉘로 지정할 !#/usr/bin/env bashbash있기 때문입니다.


죄송합니다. 코드가 누락되었습니다. 환경에 대한 설명 감사합니다.
부드러운 노랑

Attie의 대답은 설명대로 생략 쇼, 당신은 확장되지 않은 그 "$@"echo있지만, 명령 $1의 기본값 1으로 설정하지 않을 경우.
AFH

0

" 누락 된 코드 "는 매우 중요합니다.

#!/usr/bin/env bash

main() {
  echo ${1:-1}
}

main "$@"

여기서 우리는 main함수를 호출 하고 제공합니다 "${@}"(즉, 모든 주장, 분리 유지).

${@}아무것도로 확장 (예 : 스크립트가 인수없이 호출)를이 main()불려 없는 인수, 따라서 ${1:-1}안쪽 main()은 "에 따라, 특별한 영향을 미칠 것입니다 기능 매개 변수 대체 "의미.

특히 선언되고 NULL이 아닌 경우 또는 선언되지 않거나 NULL ${parameter:-default}${parameter}경우 값으로 확장 default됩니다. 참고 ${parameter:-default}로 미묘하게 다른 행동 ${parameter-default}.

${parameter-default}${parameter:-default}거의 동일합니다. 엑스트라 :는 매개 변수가 선언되었지만 널인 경우에만 차이를 만듭니다.

따라서 ${1:-1}주어진 첫 번째 인수로 확장되거나 기본값은 1다음과 같습니다.

$ ./script.sh
1
$ ./script.sh test
test

의 사용 /usr/bin/env오두막에서 우리가 "할 수 있습니다 사용 bash인터프리터로 의 전체 경로를주지 않고" bash... env현재 환경의를 검색합니다 ${PATH}우리를 위해 일치하는 첫 번째 후보를 사용합니다. shebang은 인터프리터에 대한 절대 경로가 필요하며을 사용하여이 제한을 해결할 수 env있습니다.

종종 있지만 - 인터프리터가 다수 위치에있을 수 이것은 파이썬 스크립트 매우 일반적입니다 /usr/bin/python,이 같은 일을 지원 VIRTUALENV 도.

자세한 설명은 " 사람들이 왜 파이썬 스크립트의 첫 번째 줄에 #! / usr / bin / env python shebang을 작성합니까? "를 참조하십시오.


1
참고 주셔서 감사합니다 env: /usr/bin/OSX에 있습니까? 그렇다면, bash스크립트를 실행할 프로그램으로 지정하는 MAC 호환 방식을 제공합니다 .
AFH

몰라요, 그러나 그것은 보인다 !
Attie

링크 주셔서 감사합니다 : 사용 가능한 이유로 이것을 포함하도록 답변을 확장했습니다 env.
AFH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.