Fish

在fish shell中設置預設解釋器

  • July 3, 2019

我已經mill在 arch linux 上安裝了 fish 作為我的預設 shell。由於文件/usr/bin/mill不是以 shebang 開頭的,fish 不會執行該文件。相反,它響應

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

我可以執行 mill withbash -c 'mill'但我不想一直這樣做。我也不想將其添加為 Mill 的別名。當腳本中沒有shebang而不是失敗時,是否可以將fish配置為始終使用sh或bash?或者可能存在作業系統級別的問題?

編輯: 米爾只是一個例子。我用不同的腳本多次遇到魚的這個特性,我不應該編輯這些腳本。這就是為什麼我正在尋找一種方法來永遠避免使用該功能,而不是一次性修復。

你不能那樣做。

你可以查看它的原始碼

       execve(actual_cmd, argv, envv);
       err = errno;

       // Something went wrong with execve, check for a ":", and run /bin/sh if encountered. This is a
       // weird predecessor to the shebang that is still sometimes used since it is supported on
       // Windows. OK to not use CLO_EXEC here because this is called after fork and the file is
       // immediately closed.

注意它是如何使用execve(not execvpor ,在 的情況下execlp有一個回退) 並且它只會在腳本以( 本身是一個非常可疑的功能開始時執行腳本;特別是因為在其他錯誤的情況下也會使用它比)。/bin/sh path``ENOEXEC``/bin/sh``:``fish``ENOEXEC

但是,如果您可以編輯腳本以:在開頭添加 a,您也可以編輯它以添加適當的 she-bang。

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