답변:
파일 이름을 스크립트 인터프리터 프로그램으로 전달하여 스크립트를 실행하면 스크립트가 인수로 전달 된 인터프리터 프로그램을 스크립트로 실행하게됩니다. 예를 들어, 이것은 '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 패키지를 만들어 설치하십시오. 온라인에서 임의의 스크립트 수를 줄이고 제거 할 수있는 뎁 수를 늘려야합니다.
bash
아닙니다 sh
.
PATH
.
/usr/local/bin
아마도 아마도 나아질 것입니다 /usr/sbin
-그것은 프로그램이 배포의 일부가 아니라이 머신에 로컬이라는 것을 나타냅니다.
짧은 버전 :
sh
명령 줄 인터프리터 (대시)입니다.
실행 sh my_script
하면 대시가 스크립트를 해석합니다.
./
첫 번째 줄을보고 사용할 통역사를 찾으려고합니다. 예를 들어 #!/bin/bash
, 심지어 #!/bin/ruby
달리기와 달리 ruby my_script
.
./
어떤 것을 찾는 것이 아니라 파일의 처음 2 바이트를 보는 시스템 실행 방법입니다.
sh
하고 파일에 sha-bang이 포함되어 있으면 sha-bang이 무시되거나 sh
링크가 있는 쉘을 연 다음 다른 쉘 또는 무엇을합니까? :)?
오류가 발생할 수있는 세 가지 주요 이유는 다음과 같습니다.
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>
.
그리고 대답은 sh가 매우 인기있는 쉘의 이름이라는 것입니다. 그러나 구식이며 다른 사람들로 대체되었습니다. 요즘 sh는 기계에 설치된 다른 쉘과 연결되어 있습니다. 예를 들어 나는 bash를 거기에 넣었다. sh에서 쉘을 실행하면 일반적으로 원래 '쉘'동작으로 일부 '호환성'모드가 트리거됩니다.
따라서 솔루션은 매우 간단합니다. sh 명령의 배후 (ls -al / bin / sh)를보고 #! / bin / whatever_you_find_there를 첫 번째 줄로 지정하십시오 (또는 스크립트에 이와 비슷한 것이 있으면 편집하십시오).
또는 스크립트 자체에 버그가있을 수 있습니다. sh가 충족하지만 실제로 사용되는 인터프리터가 아닌 종속성과 같습니다.
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
. 다른 말로, 스크립트에 확장을 두지 마십시오.
ls ~/bin/|wc -l = 428
) 나는 거기에 많은 것들을 넣었다;)
/bin
그리고 /usr/bin
당신은 그들이 확장 기능을 사용하지 않는 볼 수 있습니다.