파일이 시스템에서 인식하는 실행 파일 유형이 아니기 때문에 해당 파일을 실행할 수있는 권한이 있다고 가정하면 execve()시스템 호출은 일반적으로 ENOEXEC( 실행 파일 아님) 오류 와 함께 실패 합니다.
그러면 명령을 실행하는 데 사용되는 응용 프로그램 및 / 또는 라이브러리 기능이 결정됩니다.
예를 들어 쉘인 execlp()/ execvp()libc 함수일 수 있습니다.
대부분의 다른 응용 프로그램은 명령을 실행할 때 이들 중 하나를 사용합니다. 그들은의 방법으로 예를 들어 쉘을 호출합니다 system("command line")일반적으로 호출합니다 libc의 기능 sh이 명령 줄을 구문 분석 (경로가있는 같은 컴파일 시간 (에서 확인할 수 있습니다 /bin/sh대 /usr/xpg4/bin/shSolaris에서)) 또는 쉘 된 invoke에 저장 $SHELL처럼 스스로 vi그와 !명령, 또는 xterm -e 'command line'많은 다른 명령 ( su user -c사용자의 로그인 쉘 대신를 호출합니다 $SHELL).
일반적으로 시작하지 않는 shebang-less 텍스트 파일 #은 sh스크립트 로 간주됩니다 . 어떤 sh이 비록 다를 수 있습니다.
execlp()/ execvp(), execve()돌아올 때 ENOEXEC일반적으로 호출 sh합니다. 개보다이 시스템의 경우 sh그들은 더 이상 표준을 준수 할 수 있기 때문에 sh이 (사용하여 응용 프로그램의 일반적으로 컴파일 시간에 결정 될 것이다 execvp()/ execlp()에 다른 경로를 참조 코드의 다른 덩어리를 연결하여 sh). 예를 들어, Solaris에서는 /usr/xpg4/bin/sh(표준 POSIX sh) 또는 /bin/sh(Solaris 10 이상에서는 Bourne 쉘 (구식 화 된 쉘), Solaris 11에서는 ksh93)이됩니다.
껍질에 관해서는 많은 변형이 있습니다. bash, AT & T ksh, Bourne 쉘은 일반적으로 exec를 시뮬레이션 한 후 스크립트 자체를 해석합니다 ( 사용 되지 않는 한 자식 프로세스에서 ) execve(). 별명, 함수 ... ( bash스크립트를 sh모드 에서 해석 합니다). 해석하기 위해 (모드 에서 yash와 sh같이) 스스로 실행됩니다 .argv[0]sh
zsh, pdksh, ash기반 셸은 일반적으로 호출한다 sh(컴파일 시간에있는 결정 경로).
에 대한 csh 와 tcsh(과 sh일부 초기 BSD의의), 파일의 첫 번째 문자 인 경우 #, 그들은 스스로 그것을 해석하고 실행합니다 sh그렇지. 그것은 주석으로 csh인식 #되었지만 Bourne 쉘 은 인식하지 못했던 pre-shebang 시간으로 돌아가서 #csh 스크립트라는 힌트였습니다.
fish(최소 버전 2.4.0), execve()실패하면 오류를 반환 합니다 (스크립트로 처리하지 않습니다).
일부 쉘 ( bash또는 AT & T ksh)은 먼저 파일이 스크립트인지 여부를 경험적으로 결정하려고 시도합니다. 따라서 일부 쉘은 처음 몇 바이트에 NUL 문자가 있으면 스크립트 실행을 거부 할 수 있습니다.
또한 execve()ENOEXEC로 실패했지만 파일에 shebang 줄이 있으면 일부 쉘은 shebang 줄 자체를 해석하려고 시도합니다.
몇 가지 예가 있습니다.
- 때
$SHELL이다 /bin/bash, xterm -e 'myscript with args'할 것이다 myscript해석 bash에 sh모드. 에 있지만 xterm -e myscript with args, xterm사용execvp() 스크립트를 해석 할 수 있도록 sh.
su -c myscriptroot로그인 쉘이 있는 Solaris 10 /bin/sh및/bin/sh Bourne 쉘인 Bourne 쉘이 myscript해석 했을 것 입니다.
/usr/xpg4/bin/awk 'BEGIN{system("myscript")' 솔라리스 10에서 /usr/xpg4/bin/sh (와 동일 /usr/xpg4/bin/env myscript)으로 .
find . -prune -exec myscript {} \;Solaris 10 (을 사용하여 execvp())은 다음과 같이 해석합니다./bin/sh 심지어와 /usr/xpg4/bin/find도 POSIX 환경 (적합성 버그)에서.
csh -c myscript로 csh시작하면 해석됩니다.# 와, sh그렇지.
어떤 스크립트를 어떻게, 어떻게 호출할지 모르는 경우 스크립트를 해석하는 데 어떤 쉘이 사용 될지 확신 할 수 없습니다.
어쨌든 read -pis- bashonly 구문이므로 스크립트를 해석 bash하고 오해의 소지가있는 .sh확장자를 피해야합니다 . bash실행 파일 의 경로를 알고 다음을 사용하십시오.
#! /path/to/bash -
read -p ...
또는 다음 $PATH을 사용하여 bash실행 파일을 조회 (의미 한 것으로 가정 bash) 할 수 있습니다 .
#! /usr/bin/env bash
read -p ...
( env에서 거의 어디서나 볼 수 있음 /usr/bin). 또는 POSIX + Bourne과 호환되도록 할 수 있습니다 /bin/sh. 모든 시스템은있을 것이다 /bin/sh. 대부분의 경우 POSIX와 호환되지만 (대부분의 경우) 대신 Bourne 쉘을 찾을 수 있습니다.
#! /bin/sh -
printf >&2 'Enter a user name: '
read user
printf '%s\n' "$user"