답변:
쉘에서 스크립트를 실행하는 경우 실제로이 답변에#!/bin/sh
요약 된 shebang 이 필요하지 않습니다. OS X를 포함하여 사용한 유닉스 계열 시스템 은 인터프리터가 특별히 지정되지 않은 경우 기본값 이됩니다 ( 쉘이 아닌 경우 쉘이 아닌 스크립트는 스크립트를 실행하는 방법을 알지 못하므로 좋은 생각입니다.)/bin/sh
또한 .sh
확장이 필요하지 않습니다 . 당신은 할 수 예를 들어 실행 권한을 설정할 필요가
$ chmod +x script.sh
(이것은 $
쉘 프롬프트입니다. 대화식 쉘에 제공하는 명령을 설명하기 위해 사용하고 있습니다. 입력하지 마십시오!)
그러나 혼란스러워하는 것은 script.sh
현재 디렉토리에 스크립트를 만들고 단순히을 입력하여 실행하려고한다는 것 script.sh
입니다. 예 :
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
의미 control- D. Unix 사용에 대한 많은 글에서이 표기법을 찾을 수 있습니다.)
script.sh
이 경우 쉘 스크립트 라는 사실 은 문제의 절반에 지나지 않습니다. 실제 문제는 기본적으로 쉘이 프로그램의 현재 디렉토리를 검색하지 않는다는 것입니다. 그러나 이것은 작동합니다.
$ sh script.sh
hello, world
sh
스크립트를 인수로 사용 하기 때문 입니다.
당신은 다시 스크립트를 또는 실행할 수 있는 가 (즉, 실행 표시된 경우, 현재 디렉토리에 실행 파일을- chmod +x
) 현재 디렉토리에서 하나를 실행하도록 지정하여 :
$ ./script.sh
hello, world
스크립트를의 디렉토리로 이동할 수도 있습니다 PATH
. 나는 추천 /usr/local/bin
스크립트가 사용되는 시스템 전체 또는 의도 경우이에 대한 bin
스크립트는 당신을위한 경우에 당신의 가정에있는 디렉토리. 후자는 홈 디렉토리에 다음 줄을 추가 $HOME/bin
하여을 추가 해야합니다. 새 bin 디렉토리로 확장됩니다 .PATH
.profile
PATH=$HOME/bin:$PATH
export PATH
마지막으로 원하는 경우 실제로 현재 디렉토리를에 추가 할 수 있습니다. 그러면 현재 디렉토리를 PATH
포함 script.sh
하거나 다른 실행 파일 및 유형을 포함하는 디렉토리로 이동할 수 있습니다.
$ script.sh
그것을 실행하십시오. 그러나, 나는이 방법은 사용하지 않는 것이 좋습니다 공격자가 지금은 (예를 들어, 이름, 실행 스크립트를 놓아 임의의 실행 파일을 실행하도록 유도 수, ls
당신이있을 것 디렉토리를).이 경우 정말 그것을 할 싶어하지만, 에 다음을 추가하십시오 .profile
.
PATH=.:$PATH
export PATH
sl
또는 lls
나 l
... 즉, 오타. 그냥 나가 .
십시오 $PATH
. 또한 시스템의 모든 사람을 반드시 신뢰할 필요는 없습니다. 예를 들어, 일부는 그 어떤 디렉토리에 임의의 파일을 드롭하는 공격자를 허용 악용있다 생각하지만, 필요 당신 에게 이관하기 위해 해당 파일을 실행하기 위해 더 나은 악용 (예를 들어, 데이터 수집 및 전화 가정). 심층 방어!
/tmp
세계 기록 가능한 디렉토리에 남겨 둘 수 있습니다.
/tmp
et al. 영토와 함께.
sh
스크립트 파일이 실행 가능으로 표시되어 있으면 호출 할 필요가 없습니다 . 이 경우 기존 쉘에서 다른 명령을 수행하는 것처럼 내 이름을 호출 할 수 있습니다.
완전히 적절하려면 두 가지 작업을 수행해야합니다.
스크립트 맨 위에 shebang 지시문 을 포함하도록 스크립트를 편집하십시오 .
#!/bin/sh
... 그러면 스크립트를 실행하는 데 사용할 인터프리터가 셸에 전달됩니다. 이 경우 /bin/sh
실행 파일입니다.
chmod 명령 을 사용 하여 스크립트를 실행 가능 으로 표시하십시오 .
chmod u+x scriptname.sh
두 가지를 모두 수행하면 명령 줄에 스크립트 파일 이름을 입력하여 스크립트를 실행할 수 있어야합니다. PATH 변수에 포함 폴더를 추가하는 추가 단계를 수행하지 않는 한 스크립트와 동일한 디렉토리에 있어야합니다 . 어떤 쉘이 스크립트를 실행하는지 상관하지 않는다면, 지정하기 위해 1 단계가 필요하지 않지만 sh
"shebangsh"를 정확하고 설정하는 것이 더 좋습니다.
/bin/sh
아프지 않지만에 필요하지는 않습니다.
ksh
HP-UX에서 많은 스크립트를 다시 쓰는 데 사용했기 때문에 항상 지정하는 것이었지만 엄격하게 필요하지는 않다는 것을 아는 것이 좋습니다.
exec
syscall 을 사용 하면 ENOEXEC
(exec 형식 오류) ). 죄송합니다, @bmike, @ ChrisW.Rea. 이제 답변을 편집하겠습니다.