在fish shell中设置默认解释器

在fish shell中设置默认解释器

我已经安装了mill在 arch linux 上,我的默认 shell 是 Fish。由于该文件/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,bash -c 'mill'但我不想一直这样做。我也不想将其添加为 mill 的别名。当脚本中没有 shebang 而不是失败时,是否可以将 Fish 配置为始终使用 sh 或 bash?或者可能存在操作系统级别的问题?

编辑: 米尔只是一个例子。我已经多次遇到了 Fish 的这个功能,并且使用了我不应该编辑的不同脚本。这就是为什么我正在寻找一种方法来永远避免该功能,而不是仅针对磨机进行一次性修复。

答案1

你不能那样做。

你可以检查它的源代码:

        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(不是execvp或,在 的情况下execlp会回退到),并且它只会运行以(本身是一个相当可疑的功能;特别是在出现其他错误的情况下使用它)的脚本比)。/bin/sh pathENOEXEC/bin/sh:fishENOEXEC

但是,如果您可以编辑脚本以:在开头添加 a,那么您也可以编辑它以添加适当的 she-bang。

相关内容