Fish Shell: 실행 형식 오류

Fish Shell: 실행 형식 오류

우분투에서 ( $ uname -a:) Linux kumanaku 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux방금 설치했습니다물고기( $ fish --version:) fish, version 2.7.1다음 명령을 사용하십시오.

sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish
chsh -s /usr/bin/fish
echo /usr/bin/fish | sudo tee -a /etc/shells

실행 fish하고 사용할 수 있지만 다음과 같은 간단한 셸 파일을 실행하면 다음과 같습니다.

echo "something"

다음 메시지를 받았습니다.

$ ./myscript.sh

Failed to execute process './myscript.sh'. Reason:
exec: Exec format error
The file './myscript.sh' is marked as an executable but could not be run by the operating system.

아니요셰르본내 스크립트에서. 을 추가하면 #!/usr/bin/env fish모든 것이 잘 작동하지만(예: 스크립트가 성공적으로 시작됨) 스크립트가 다른 쉘과 호환되도록 유지하려면 이와 같은 줄을 피하고 싶습니다.

어떤 아이디어가 있나요?

답변1

실행 파일을 커널에서 기본적으로 실행할 수 없는 경우 shebang 라인이 필요합니다. 커널은 특정 형식의 기계어 코드만 실행할 수 있습니다(매우 낮은 주파수대부분의 Unix 변형에서) 또는 때로는 다른 형식(예: Linux에서는 실행 가능한 형식을 등록할 수 있음)binfmt_misc). 실행 파일에 필요한 경우통역사그런 다음 커널은 어떤 인터프리터를 호출할지 알아야 합니다. 이것은셰르본라인은 다음과 같습니다.

스크립트가 Fish 구문을 사용하는 경우 첫 번째 줄은 다음과 같아야 합니다.

#!/usr/bin/env fish

fish(절대 경로를 사용할 수 있지만 실행 파일이 다른 위치에 있는 /usr/bin/fish시스템에서 실행하려면(예: 와 ) 스크립트를 수정해야 합니다 /usr/local/bin/fish.)

스크립트가 sh 구문으로 되어 있는 경우 다음을 사용하세요.

#!/bin/sh

(모든 최신 Unix 시스템에는 POSIX shat이 있으므로 /bin/sh필요하지 않습니다 env.)

스크립트가 bash 구문(예: sh와 일부 bash 관련 확장)으로 되어 있는 경우 다음을 사용하세요.

#!/usr/bin/env bash

실제로 Linux에서도 #!/bin/bash작동합니다 .

이 모든 것은 스크립트를 호출하는 쉘과 무관합니다. 중요한 것은 스크립트가 어떤 언어로 작성되었는지입니다.

답변2

경로를 참조하여 스크립트를 실행하려면 shebang이 필요합니다. 그렇지 않으면 운영 체제가 실행을 시도하지만 바이너리 실행 파일이 아니기 때문에 실패합니다.

Shebang을 사용하지 않으려면 스크립트를 실행할 대상을 지정해야 합니다. 귀하의 경우에는 fish.

fish myscript.sh

답변3

  1. 다음 방법도 작동합니다.

    sudo ./<your script>

기본적으로 bash를 실행하기 때문에스도대부분의 배포판에서 명령을 사용합니다. 그러나 스크립트를 변경하고 싶지 않다면 아마도 이유가 있을 것입니다.

노트: 이는 이러한 유형의 문제에 접근하는 잘못된 방법입니다. 다음 사항을 변경하세요.Gilles가 제안한

관련 정보