답변:
우분투 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 bash수 bash있기 때문입니다.
"$@"에 echo있지만, 명령 $1의 기본값 1으로 설정하지 않을 경우.
" 누락 된 코드 "는 매우 중요합니다.
#!/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을 작성합니까? "를 참조하십시오.
env: /usr/bin/OSX에 있습니까? 그렇다면, bash스크립트를 실행할 프로그램으로 지정하는 MAC 호환 방식을 제공합니다 .
env.