파일이 시스템에서 인식하는 실행 파일 유형이 아니기 때문에 해당 파일을 실행할 수있는 권한이 있다고 가정하면 execve()
시스템 호출은 일반적으로 ENOEXEC
( 실행 파일 아님) 오류 와 함께 실패 합니다.
그러면 명령을 실행하는 데 사용되는 응용 프로그램 및 / 또는 라이브러리 기능이 결정됩니다.
예를 들어 쉘인 execlp()
/ execvp()
libc 함수일 수 있습니다.
대부분의 다른 응용 프로그램은 명령을 실행할 때 이들 중 하나를 사용합니다. 그들은의 방법으로 예를 들어 쉘을 호출합니다 system("command line")
일반적으로 호출합니다 libc의 기능 sh
이 명령 줄을 구문 분석 (경로가있는 같은 컴파일 시간 (에서 확인할 수 있습니다 /bin/sh
대 /usr/xpg4/bin/sh
Solaris에서)) 또는 쉘 된 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 myscript
root
로그인 쉘이 있는 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 -p
is- bash
only 구문이므로 스크립트를 해석 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"