처음에 shebang 줄 (#! / path / to / shell)이 없을 때 스크립트를 실행하는 쉘은 무엇입니까? / bin / sh라고 가정하지만 확인할 수 없습니다.
정확한 동작은 프로그램에 따라 다릅니다 있도록 커널은 스크립트와 수익을 실행하기를 거부 ENOEXEC, 당신은 스크립트 실행 에서를 .
- bash 4.2.39 – 자체 사용
- busybox-ash 1.20.2 – 자체 사용
- 대시 0.5.7 – / bin / sh 실행
- fish 1.23.1 – ENOEXEC에 대해 불평하고 잘못된 파일을 탓합니다.
- AT & T ksh 93u + 2012.08.01 – 자체 사용
- mksh R40f – / bin / sh를 실행합니다
- pdksh 5.2.14 – / bin / sh를 실행합니다
- sh-heirloom 050706 – 자체 사용
- tcsh 6.18.01 – / bin / sh를 실행합니다
- zsh 5.0.0 – / bin / sh를 실행합니다
- cmd.exe 5.1.2600 – 당신을보고 웃겨요.
에서 의 glibc , 기능 execv()
또는 execve()
단지 ENOEXEC를 반환합니다. 그러나이 execvp()
오류 코드를 숨기고 자동으로 / bin / sh를 호출합니다. (이것은 exec (3p)에 문서화되어 있습니다.)
모든 플랫폼에서 실행되는 쉘 스크립트 작성과 관련하여 "모범 사례"로 간주되는 것은 무엇입니까? (오케이, 이것은 일종의 개방형입니다)
에 어느 스틱 sh
만 POSIX 정의 기능, 또는 단지 전체 이동 배쉬 (널리 가능)하고 배포하는 경우 귀하의 요구 사항에 언급.
(이제 생각하면 Perl 또는 아마도 Python은 더 나은 구문을 갖는 것은 말할 것도없고 이식성이 훨씬 뛰어납니다.)
항상 세방 라인을 추가하십시오. bash 또는 zsh를 사용 #!/usr/bin/env bash
하는 경우 쉘 경로를 하드 코딩하는 대신 사용 하십시오. (그러나 POSIX 쉘은로 보장되므로이 경우에는 /bin/sh
건너 뛰십시오 env
.)
불행히도, /bin/sh
항상 같은 것은 아닙니다. GNU autoconf 프로그램은 여러 가지 다른 문제를 처리해야 합니다.
zsh를 사용할 수없고 zsh를 사용할 수없는 경우 bash로 폴백하는 스크립트를 작성할 수 있습니까? 아래처럼 두 개의 shebang 행을 넣으려고 시도했지만 잘못된 인터프리터에서 오류가 발생했습니다 . / bin / zsh : zsh가없는 시스템에서 시도하면 그러한 파일이나 디렉토리가 없습니다 .
셰방 라인은 하나만있을 수 있습니다. 개행 문자 뒤의 모든 것은 커널에 의해 읽히지 않고 쉘에 의한 주석으로 취급됩니다.
그건 가능한 실행으로하는 스크립트를 작성하는 #!/bin/sh
쉘을 사용할 수를 확인하고, 실행, exec zsh "$0" "$@"
또는 exec bash "$0" "$@"
그 결과에 따라. 그러나 bash와 zsh가 사용하는 구문은 여러 곳에서 매우 다르므로 자신의 정신을 위해 이것을 권장하지 않습니다 .