Shebang을 사용하여 Lubuntu(Xenial) Minimal(+LXDE) VM에서 스크립트를 실행할 수 없습니다.

Shebang을 사용하여 Lubuntu(Xenial) Minimal(+LXDE) VM에서 스크립트를 실행할 수 없습니다.

단순한 오타와 깊은 무지로 인해 여기서 조금 당황스럽습니다. 슬픔을 덜어주세요.

  1. hasbangs/shebangs에는 항상 선행 /문자 가 있어야 합니다.#!/bin/bash
  2. 좀 더 정확하게
  3. 복사 및 붙여넣기를 활성화하지 않고 호스트와 게스트(가상) 시스템 간에 작업하는 경우 중지하십시오. 오타는 코드와 문제를 망칠 수 있습니다(사람들을 짜증나게 할 수 있음). 작업을 복사하여 붙여넣는 방법이나 하나의 컴퓨터에서 작업하는 방법을 알아보세요. 수동으로 다시 입력하는 것은 어리석은 일입니다.
  4. 감사하십시오. 여기 정말 도움이 많이 되는 사람들이 있어요.
  5. 둘 다 Linux이지만 배포판마다 셸 및 스크립트 측면에서 고유한 특성이 있을 수 있습니다. (여기에는 배포판의 전체 버전과 최소 버전이 모두 포함됩니다.) 쉘을 확인하십시오( ps -p$$ -ocmd=나에게 도움이 되었습니다)원천). 디렉터리를 수동으로 만들어야 합니까(특히 최소 배포의 경우)?
  6. 나에게는 이것이 대부분의 시스템(예: "휴대용")에서 가장 잘 작동하기 때문에 #!/usr/bin/env <SHELL>SHELL 등을 사용하여 스크립트를 시작합니다 bash. 많은 지침 웹사이트에서는 아무런 설명이나 경고 없이 "항상 시작" sh만 말하는 것 같습니다 . #!/bin/bash진짜가 아닙니다.
  7. 주택 검사. 이 도구는 매우 유용할 수 있습니다. (신용 거래 -로에마)

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/bashUbuntu 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

이렇게 하면 시스템이 bashvia 경로를 자동으로 검색하고(또는 선택한 인터프리터) env찾은 첫 번째 경로를 사용합니다.

관련 정보