.sh 파일을 실행하기 전에 sh를 넣어야하는 이유는 무엇입니까?


16

.sh터미널에서 파일 을 실행하려면 sh앞에 파일을 넣어야 합니다.

이것을 피하고 타이핑을 저장하는 방법이 있습니까?


3
~ / bin에 폴더를 만들어 셸 스크립트를 넣고 $ PATH에 넣고 폴더 작업을 ~ / bin 폴더에 첨부하여 실행 권한을 자동으로 설정하여 잊어 버릴 수 없기 때문에.
Kaydell

답변:


22

쉘에서 스크립트를 실행하는 경우 실제로이 답변에#!/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

'.' 시작 대신 $ PATH의 끝에서 팬텀 'ls'에 대해 걱정할 필요가 없습니다. (누군가가 당신의 시스템에 얻을 수 있는지 있지만, 당신은 더 큰 문제를 가지고있다.)
TJ Luoma

2
@TJ은,하지만 당신은 않습니다 같은 물건에 대해 걱정할 필요가 sl또는 llsl... 즉, 오타. 그냥 나가 .십시오 $PATH. 또한 시스템의 모든 사람을 반드시 신뢰할 필요는 없습니다. 예를 들어, 일부는 그 어떤 디렉토리에 임의의 파일을 드롭하는 공격자를 허용 악용있다 생각하지만, 필요 당신 에게 이관하기 위해 해당 파일을 실행하기 위해 더 나은 악용 (예를 들어, 데이터 수집 및 전화 가정). 심층 방어!
리드

@TJLuoma @Reid가 말한 것 외에도 개인 OS X 데스크탑 외에 유닉스 시스템에 대한 많은 사용 사례가 있음을 명심하십시오. 그것을 시도하지는 않았지만 손님 계정조차도 그 항목 중 하나를 /tmp세계 기록 가능한 디렉토리에 남겨 둘 수 있습니다.
zigg

다른 사람이 사용하는 디렉토리에 액세스 할 수있는 시스템을 사용하는 경우 더 큰 문제가 있습니다.
TJ Luoma

@TJLuoma 그렇다면 어떤 유닉스 시스템에서도 여러 계정을 사용하지 않는 것이 가장 좋습니다. /tmpet al. 영토와 함께.
zigg

10

sh스크립트 파일이 실행 가능으로 표시되어 있으면 호출 할 필요가 없습니다 . 이 경우 기존 쉘에서 다른 명령을 수행하는 것처럼 내 이름을 호출 할 수 있습니다.


완전히 적절하려면 두 가지 작업을 수행해야합니다.

  1. 스크립트 맨 위에 shebang 지시문 을 포함하도록 스크립트를 편집하십시오 .

    #!/bin/sh

    ... 그러면 스크립트를 실행하는 데 사용할 인터프리터가 셸에 전달됩니다. 이 경우 /bin/sh실행 파일입니다.

  2. chmod 명령 을 사용 하여 스크립트를 실행 가능 으로 표시하십시오 .

    chmod u+x scriptname.sh

두 가지를 모두 수행하면 명령 줄에 스크립트 파일 이름을 입력하여 스크립트를 실행할 수 있어야합니다. PATH 변수에 포함 폴더를 추가하는 추가 단계를 수행하지 않는 한 스크립트와 동일한 디렉토리에 있어야합니다 . 어떤 쉘이 스크립트를 실행하는지 상관하지 않는다면, 지정하기 위해 1 단계가 필요하지 않지만 sh"shebangsh"를 정확하고 설정하는 것이 더 좋습니다.


Shebang은 실제로 /bin/sh아프지 않지만에 필요하지는 않습니다.
zigg

@zigg-맞습니다. Chris가 내 편집 내용을 신경 쓰지 않기를 바랍니다… Nuke 또는 원하는대로 다시 편집 : -0
bmike

@ bmike 편집은 나를 위해 작동합니다. shebangs에 관해서는, 나의 습관은 항상 kshHP-UX에서 많은 스크립트를 다시 쓰는 데 사용했기 때문에 항상 지정하는 것이었지만 엄격하게 필요하지는 않다는 것을 아는 것이 좋습니다.
Chris W. Rea

1
Shebang 필요성에 대한 이전 진술에서 물러나야한다고 생각합니다 (나머지 답변은 여전히 ​​유효합니다). 쉘에서 shebang-less 스크립트를 실행할 수 있지만 execsyscall 을 사용 하면 ENOEXEC(exec 형식 오류) ). 죄송합니다, @bmike, @ ChrisW.Rea. 이제 답변을 편집하겠습니다.
zigg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.