Shell-Script

fish shell:執行格式錯誤

  • September 1, 2021

在 Ubuntu ( $ 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 ( $ 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並使用它,但是當我啟動一個簡單的 shell 文件時,例如:

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.

我的劇本中沒有shebang。如果我添加#!/usr/bin/env fish,一切正常(即腳本已成功啟動),但我想避免這樣的行,以使我的腳本與不同的 shell 兼容。

任何的想法 ?

如果執行檔不能由核心本地執行,則需要一個 shebang 行。核心只能以特定格式(大多數 Unix 變體上的ELF)執行機器程式碼,有時也可以執行其他格式(例如在 Linux 上,您可以通過binfmt_misc註冊可執行格式)。如果執行檔需要解釋器,那麼核心需要知道呼叫哪個解釋器。這就是shebang線的用途。

如果你的腳本是fish語法,它的第一行必須是

#!/usr/bin/env fish

(您可以改用絕對路徑,但如果您想在fish執行檔位於不同位置的機器上執行腳本,例如/usr/bin/fishvs ,則必須修改腳本/usr/local/bin/fish。)

如果您的腳本是 sh 語法,請使用

#!/bin/sh

(所有現代 Unix 系統都有一個 POSIX sh at/bin/sh所以你不需要env。)

如果您的腳本採用 bash 語法(即 sh 加上一些特定於 bash 的擴展),請使用

#!/usr/bin/env bash

在 Linux 上,實際上#!/bin/bash也可以使用。

所有這些都與您從哪個 shell 呼叫腳本無關。重要的是腳本是用什麼語言編寫的。

引用自:https://unix.stackexchange.com/questions/491419