fish shell:執行格式錯誤
在 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/fish
vs ,則必須修改腳本/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 呼叫腳本無關。重要的是腳本是用什麼語言編寫的。