Fish shell:执行格式错误

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 --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/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 调用脚本无关。重要的是脚本是用什么语言编写的。

答案2

您需要有一个 shebang 才能通过引用其路径来执行脚本。否则,操作系统将尝试执行它,但会失败,因为它不是二进制可执行文件。

如果您不想使用 shebang,则需要指定执行脚本的内容。在你的情况下,它应该是fish

fish myscript.sh

答案3

  1. 下面的方法也有效:

    sudo ./<your script>

因为它默认运行 bash须藤大多数发行版中的命令。但如果您不想更改脚本,可能是有原因的。

笔记: 这是解决此类问题的错误方法。进行更改为吉尔斯建议

相关内容