단순한 오타와 깊은 무지로 인해 여기서 조금 당황스럽습니다. 슬픔을 덜어주세요.
- hasbangs/shebangs에는 항상 선행
/
문자 가 있어야 합니다.#!/bin/bash
- 좀 더 정확하게
- 복사 및 붙여넣기를 활성화하지 않고 호스트와 게스트(가상) 시스템 간에 작업하는 경우 중지하십시오. 오타는 코드와 문제를 망칠 수 있습니다(사람들을 짜증나게 할 수 있음). 작업을 복사하여 붙여넣는 방법이나 하나의 컴퓨터에서 작업하는 방법을 알아보세요. 수동으로 다시 입력하는 것은 어리석은 일입니다.
- 감사하십시오. 여기 정말 도움이 많이 되는 사람들이 있어요.
- 둘 다 Linux이지만 배포판마다 셸 및 스크립트 측면에서 고유한 특성이 있을 수 있습니다. (여기에는 배포판의 전체 버전과 최소 버전이 모두 포함됩니다.) 쉘을 확인하십시오(
ps -p$$ -ocmd=
나에게 도움이 되었습니다)원천). 디렉터리를 수동으로 만들어야 합니까(특히 최소 배포의 경우)? - 나에게는 이것이 대부분의 시스템(예: "휴대용")에서 가장 잘 작동하기 때문에
#!/usr/bin/env <SHELL>
SHELL 등을 사용하여 스크립트를 시작합니다bash
. 많은 지침 웹사이트에서는 아무런 설명이나 경고 없이 "항상 시작"sh
만 말하는 것 같습니다 .#!/bin/bash
진짜가 아닙니다. - 주택 검사. 이 도구는 매우 유용할 수 있습니다. (신용 거래 -로에마)
Shebang이 있는 Lubuntu(Xenial) Minimal(+LXDE) VM에서 스크립트를 실행할 수 없습니다. 없어도 괜찮습니다.
다음 제안을 따르세요이전 기사, 나는 shebang에서만 다른 4가지 버전으로 매우 간단한 스크립트를 만들었습니다.
echotest (shebang 라인 제외):
#blantantly simple test to figure out script problems
echo "this is working - type something for me to repeat it"
read input
echo $input
에코테스트-빈-배시
#!bin/bash
#blantantly simple test to figure out script problems
echo "this is working - type something for me to repeat it"
read input
echo $input
#!bin/dash
및 [편집: 이 문서의 스크립트가 아닌 아래에 "bin" 삽입] 에 해당하는 두 개가 더 있습니다 #!bin/sh
.
파일은 ~/bin
어딘가에서 포럼을 읽은 후 수동으로 만든 디렉토리에 저장됩니다.
거기에서 테스트 스크립트는 다음을 생성합니다.
x@computer:~$ echotest
this is working - type something for me to repeat it
test1
test1
즉, Shebang 없이도 작동하지만
x@computer:~$ echotest-bin-bash
bash: /home/x/bin/echotest-bin-bash: bin/bash: bad interpreter: No such file or directory
x@computer:~$ echotest-bin-dash
bash: /home/x/bin/echotest-bin-dash: bin/bash: bad interpreter: No such file or directory
x@computer:~$ echotest-bin-sh
bash: /home/x/bin/echotest-bin-sh: bin/sh: bad interpreter: No such file or directory
더 멀리,
x@computer:~$ ./echotest-bin-bash
bash: ./echotest-bin-bash: No such file or directory
포럼/블로그에서 읽은 다른 제안을 테스트하기 위해 스크립트를 삭제 ~/bin
하고 /usr/local/bin
.
x@computer:~$ echotest
bash: /home/x/bin/echotest: No such file or directory
다른 모든 변형도 마찬가지입니다.
하지만,
x@computer:~$ sudo /usr/local/bin/echotest
this is working - type something for me to repeat it
test
test
(즉, 작동한다)
x@computer:~$ sudo /usr/local/bin/echotest-bin-bash
sudo: unable to execute /usr/local/bin/echotest-bin-bash: No such file or directory
Hangup
모든 권한은 chmod +x <filename>
또는 (흔하지 않음)을 통해 부여 되었으며 chmod 777 <filename>
두 번 확인되었습니다 ls -l /rele/vant/directory
.
x@computer:~$ echo $PATH
/home/x/bin:/home/x/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
이 질문을 처음 시도했을 때 이전 답변에 답하기 위해 Lubuntu Minimal은 다음이 설치된 것을 보여주었습니다.
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii dash 0.5.8-2.1ubu amd64 POSIX-compliant shell
ii bash 4.3-14ubuntu amd64 GNU Bourne Again SHell
포럼에서 수집한 완전히 이해하지 못하는 명령을 사용합니다.
x@computer:~$ file "$(type -P bash)" 2>/dev/null
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=[redacted for the forum], stripped
x@computer:~$ type -p bash
/bin/bash
Murphy, 이 글을 읽고 계시다면 저는 bin/bash를 호출하여 프롬프트를 받는 데 운이 없었습니다. 내 검색어가 대상 자료에서 너무 많은 내용을 가져오고 있는지 모르겠습니다.
마지막으로 .desktop 파일에서(즉, shebang 없이) 함수 스크립트를 테스트했는데 완벽하게 작동했습니다( Exec=echotest
).
Shebon이 작동하지 않는 이유는 무엇입니까? 해당 스크립트는 #!bin/bash
Ubuntu Mate(Xenial) 호스트에서 제대로 작동합니다.
이것은 매우 기본적인 오류라고 확신하지만 혼란스럽습니다. 이것은 나의 두 번째 시나리오이므로 기본 자료를 사용할 수 있게 되어 기쁩니다.
미리 감사드립니다
편집하다
고마워요 Jesse_b.
Edit1.1 - 아니요, 제가 틀렸습니다. #!/bin/bash는 작동합니다. 단말기 내역을 검색해봤는데 아까 말씀드린 항목을 찾을 수 없었습니다.
그리고 #!/usr/bin/env bash
완벽하게 작동합니다.
편집 2
고마워요 머피
hashbang을 사용했고 #!/bin/sh
훌륭하게 #!/bin/bash
작동합니다.
더 멀리
x@computer:~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash
x@computer:~$ /usr/bin/env | grep bash
SHELL=/bin/bash
x@computer::~$ ls -l /bin/*sh
-rwxr-xr-x 1 root root 1037528 May 16 2017 /bin/bash
-rwxr-xr-x 1 root root 154072 Feb 17 2016 /bin/dash
lrwxrwxrwx 1 root root 4 May 16 2017 /bin/rbash -> bash
lrwxrwxrwx 1 root root 4 Feb 17 2016 /bin/sh -> dash
최종 편집- 배포판마다 hashbang/shebang에 대한 형식 지정 방법이 다소 엄격합니다. 내가 찾은이 게시물그 중 하나는 이전 버전의 Mint/Xfce 및 Lubuntu/LXDE와 유사한 문제를 설명했습니다.
(Lubuntu Minimal/LXDE 게스트의 Ubuntu Mate 호스트에서 스크립트를 수동으로 다시 입력했을 때 문제가 발생했습니다. 배포판 간의 다른 동작을 관찰하고 있다고 생각했지만 a) shebang 형식의 중요성을 이해하지 못합니다. , b) 일부 사이트는 좋은 조언을 제공하지 않을 수 있습니다. c) 철자 오류가 자주 발생합니다. 실험적으로 스크립트가 shebang 없이 작동하는지 확인하세요. )
답변1
해시뱅은 슬래시로 시작해야 합니다./
#!bin/bash
거의 확실하게 유효한 디렉터리/파일 경로가 아닙니다.#!/bin/bash
셸이 존재하는지 확실하지 않은 경우 언제든지 ls
또는 를 사용하여 경로가 올바른지 확인할 수 있습니다. 또는 경로를 작성하는 보다 이식 가능한 방법은 다음과 같습니다.
#!/usr/bin/env bash
이렇게 하면 시스템이 bash
via 경로를 자동으로 검색하고(또는 선택한 인터프리터) env
찾은 첫 번째 경로를 사용합니다.