스크립트를 실행하는 ./와 sh의 차이점은 무엇입니까?


71

간단한 스크립트를 작성했습니다. 을 실행할 때 sh <myscriptname.sh>올바른 출력을 얻었지만을 실행할 때 ./<myscriptname.sh>오류가 발생했습니다.

내가 할 때 sh와 차이점이 무엇입니까 ./?


15
"오류가 발생했습니다"라고 말하는 대신 오류가 말한 내용을 붙여 넣으면 도움이됩니다.
SpashHit

답변:


67

파일 이름을 스크립트 인터프리터 프로그램으로 전달하여 스크립트를 실행하면 스크립트가 인수로 전달 된 인터프리터 프로그램을 스크립트로 실행하게됩니다. 예를 들어, 이것은 'filename.sh'인수를 가진 'sh'프로세스와 같습니다. sh인터프리터는 파일을 여는.

반면에 스크립트 자체를 실행하면 시스템이 지정된 인터프리터 프로그램을 호출하여 스크립트 내용을 제공합니다. 이 경우 프로세스는 인수없이 'filename.sh'처럼 보입니다.

뱅 라인이 있는지 확인해야합니다.

#!/bin/bash
# bash script here

뱅 라인은 스크립트의 첫 번째 라인 이며 동일한 두 문자로 시작 #!합니다. 스크립트를 실행하려고 할 때 시스템이 읽은 다음 시스템은 스크립트를 프로그램에 바로 전달합니다. 이 줄은 bash와 관련이 없으며 파이썬과 perl에서도 매우 다른 언어이지만 작동합니다. 당신이 사용하는 것 #!/usr/bin/python, 예를 들면 다음 파이썬 코드를 따르십시오.

스크립트가 있으면 실행 권한을 설정했는지 확인하십시오.

chmod a+x filename.sh

그런 다음 스크립트를 자체 프로세스로 실행할 수 있습니다.

./filename.sh

또는 다음과 같이 멋진 프로그램 이름으로 알려진 위치에 파일을 저장하십시오 /usr/sbin.

sudo cp filename.sh /usr/sbin/program-name
program-name

그리고 이것이 올바른 권한으로 뱅 라인을 사용 하는 실질적인 이점입니다 . 배포 에 관한 것 입니다. 스크립트를 실행할 프로그램을 기억해야하는 경우 사용자가 스크립트를 실행하도록하는 것은 매우 어렵습니다. 스크립트를 실행할 때마다 스크립트의 전체 경로를 제공해야합니다. 어디를 퍼팅으로 /usr/local/bin, 예를 들어, 및 실행 파일을 만드는 스크립트를 사용하려고 시도하는 사람들을위한 슬픔의 엄청 많이 절약 할 수 있습니다. 이러한 프로그램은 컴퓨터의 모든 사용자 가 사용할 수있게됩니다 .

식별에도 좋습니다. top프로그램에 들어가면 뱅 라인없이 스크립트를 실행하면 인터프리터 이름 즉 bash, perl또는을 갖게됩니다 python. 그러나 올바른 권한으로 스크립트를 실행하면 스크립트 이름이 표시됩니다.

참고 : 모든 사람이 액세스 할 수있는 스크립트를 배포하려면 매뉴얼 페이지와 deb 패키지를 만들어 설치하십시오. 온라인에서 임의의 스크립트 수를 줄이고 제거 할 수있는 뎁 수를 늘려야합니다.


1
개인 bin 폴더를 사용할 수도 있습니다. 홈 폴더에 bin 폴더를 만들고 로그 아웃 한 후 다시 로그인하면 sh 또는 ./없이 해당 폴더의 스크립트를 실행할 수 있습니다.
papukaija

물론, 홈 폴더를 PATH에 추가하는 것은 약간의 두통으로 보일 수 있습니다. 물건을 더 잘 설치하십시오. 로컬 사용자가 패키지를 설치할 수 있도록 기본적으로 ~ / .local / bin을 경로에 추가하는 것에 대해 이야기했습니다.
Martin Owens -doctormo-

기본 인터프리터는 bash아닙니다 sh.
Nathan Osman 2012 년

1
스크립트에 확장명을 넣지 마십시오. 특히 삽입 할 때는 그렇지 않습니다 PATH.
geirha

1
/usr/local/bin아마도 아마도 나아질 것입니다 /usr/sbin-그것은 프로그램이 배포의 일부가 아니라이 머신에 로컬이라는 것을 나타냅니다.
glenn jackman

41

짧은 버전 :

  • sh명령 줄 인터프리터 (대시)입니다.
    실행 sh my_script하면 대시가 스크립트를 해석합니다.

  • ./첫 번째 줄을보고 사용할 통역사를 찾으려고합니다. 예를 들어 #!/bin/bash, 심지어 #!/bin/ruby달리기와 달리 ruby my_script.


7
실제로 ./어떤 것을 찾는 것이 아니라 파일의 처음 2 바이트를 보는 시스템 실행 방법입니다.
Martin Owens -doctormo-

9
물론. 여기에 매우 긴 설명 이 있습니다. 나는 실용적이다 :)
Stefano Palazzo

사용 sh하고 파일에 sha-bang이 포함되어 있으면 sha-bang이 무시되거나 sh링크가 있는 쉘을 연 다음 다른 쉘 또는 무엇을합니까? :)?
Ini

5

당신이하는 차이점은

  • 을 사용 sh하면 터미널의 대화식 프롬프트에서 입력 한 것처럼 스크립트의 행을 해석하는 프로그램을 실행하고 있습니다.

  • ./스크립트 당신이 앉아있는 AND (예를 들어 당신이 발행 있기 때문에 실행됩니다 현재 디렉토리에 바로 여기에 가정의 바로 가기를 만들고 있어요 chmod +x myscript.sh:-) 미래의 시간을 당신에게 귀중한 시간을 절약)


3
파일이 실행 가능해야한다고 간결하게 진술 한 유일한 사람은 +1입니다.
Mikel

2
sh파일 을 사용 하여 반드시 실행 가능해야하는 것은 아닙니다.
Ini

3

오류가 발생할 수있는 세 가지 주요 이유는 다음과 같습니다.

  • 파일을
    실행 chmod +x <myscriptname.sh>하기 위해 실행 파일이 아닙니다.
  • 스크립트 실행을 허용하지 않는 파티션 ( "마운트 noexec")
    에 스크립트를 복사/usr/local/bin
  • #!라인에 오류가 있습니다
    첫 번째 줄이 있는지 확인 #!/bin/sh하거나#!/bin/bash

첫 줄이 올바르게 보이지만 여전히 작동하지 않으면 파일에 DOS 줄 끝이 없는지 확인하십시오.

오류는 다음과 같습니다.

$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory

을 (를) 실행 dos2unix <myscriptname.sh>하거나 수정 하지 않은 경우 이를 수정할 수 있습니다
perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>.


0

그리고 대답은 sh가 매우 인기있는 쉘의 이름이라는 것입니다. 그러나 구식이며 다른 사람들로 대체되었습니다. 요즘 sh는 기계에 설치된 다른 쉘과 연결되어 있습니다. 예를 들어 나는 bash를 거기에 넣었다. sh에서 쉘을 실행하면 일반적으로 원래 '쉘'동작으로 일부 '호환성'모드가 트리거됩니다.

따라서 솔루션은 매우 간단합니다. sh 명령의 배후 (ls -al / bin / sh)를보고 #! / bin / whatever_you_find_there를 첫 번째 줄로 지정하십시오 (또는 스크립트에 이와 비슷한 것이 있으면 편집하십시오).

또는 스크립트 자체에 버그가있을 수 있습니다. sh가 충족하지만 실제로 사용되는 인터프리터가 아닌 종속성과 같습니다.


0
mkdir ~/bin ; cp myscript.sh ~/bin/

echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ; 

아니 /usr/sbin, 즉, 중요하지 않은 관리 툴의 /usr/local/bin당신이 갖고 싶어하지 않을 경우 더 나은 선택이다 ~/bin/, 그러나 피할 sudo가능한 한 많이는 것이 좋습니다한다.


우분투에서 기본값은 ~/.profile이미 ~/bin존재하는 경우 에 추가하는 코드를 가지고 있습니다 PATH. 다른 말로, 스크립트에 확장을 두지 마십시오.
geirha

1
<myscriptname.sh>를 참조했지만 스크립트에 확장을 넣지 않은 이유는 무엇입니까? 나는 평범한 텍스트 파일을 볼 수 있기 때문에 ~ / bin /에 보관하는 바이너리를 편집하려고 시도하지 않기 때문에 일반적으로 수행합니다. ( ls ~/bin/|wc -l = 428) 나는 거기에 많은 것들을 넣었다;)
Joey1978

특정 작업을 수행하기 위해 스크립트를 작성한다고 가정하십시오. 그런 다음이 특정 스크립트를 파이썬으로 작성하면 훨씬 효율적으로 만들 수 있으므로 파이썬으로 다시 작성하십시오. 이제 두 가지 선택이 있습니다. 1) 현재 매우 오해의 여지가있는 .sh-extension을 그대로 두십시오. 또는 2) 스크립트의 이름을 바꾸고 스크립트의 모든 사용을 검색하고 바꾸어 새 이름을 사용하십시오. 당신이 스크립트를 보면 /bin그리고 /usr/bin당신은 그들이 확장 기능을 사용하지 않는 볼 수 있습니다.
geirha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.