在 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 --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.
没有舍邦在我的脚本中。如果我添加#!/usr/bin/env fish
,则一切正常(即脚本已成功启动),但我想避免这样的行以保持我的脚本与不同的 shell 兼容。
任何想法 ?
答案1
如果可执行文件无法由内核本机运行,则需要 shebang 行。内核只能运行特定格式的机器代码(极低频在大多数 Unix 变体上),或者有时是其他格式(例如,在 Linux 上,您可以通过注册可执行格式binfmt_misc)。如果可执行文件需要口译员那么内核需要知道要调用哪个解释器。这就是舍邦线是为了.
如果您的脚本采用 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 调用脚本无关。重要的是脚本是用什么语言编写的。
答案2
您需要有一个 shebang 才能通过引用其路径来执行脚本。否则,操作系统将尝试执行它,但会失败,因为它不是二进制可执行文件。
如果您不想使用 shebang,则需要指定执行脚本的内容。在你的情况下,它应该是fish
。
fish myscript.sh
答案3
下面的方法也有效:
sudo ./<your script>
因为它默认运行 bash须藤大多数发行版中的命令。但如果您不想更改脚本,可能是有原因的。
笔记: 这是解决此类问题的错误方法。进行更改为吉尔斯建议