首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >鱼类外壳: exec格式错误

鱼类外壳: exec格式错误
EN

Unix & Linux用户
提问于 2018-12-29 06:44:16
回答 3查看 10.1K关注 0票数 8

在Ubuntu ($ uname -aLinux 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 --versionfish, version 2.7.1):

代码语言:javascript
运行
复制
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文件时,比如:

代码语言:javascript
运行
复制
echo "something"

我收到了以下信息:

代码语言:javascript
运行
复制
$ ./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兼容。

知道吗?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2018-12-29 10:27:51

如果可执行文件不能由内核本地运行,则需要一个shebang行。内核只能以特定格式运行机器代码(大多数Unix变体上是小精灵),有时也只能运行其他格式(例如,在Linux上,可以通过宾夫姆_其他注册可执行格式)。如果可执行文件需要一个翻译员,那么内核需要知道要调用哪个解释器。这就是谢邦

如果您的脚本是鱼语法,那么它的第一行必须是

代码语言:javascript
运行
复制
#!/usr/bin/env fish

(您可以使用绝对路径,但是如果要在fish可执行文件位于不同位置的机器上运行脚本,则必须修改脚本,例如/usr/bin/fish vs /usr/local/bin/fish。)

如果您的脚本使用sh语法,请使用

代码语言:javascript
运行
复制
#!/bin/sh

(所有现代Unix系统在/bin/sh上都有POSIX sh,因此不需要env。)

如果您的脚本使用bash语法( sh加上一些bash特定的扩展),请使用

代码语言:javascript
运行
复制
#!/usr/bin/env bash

在Linux上,实际上,#!/bin/bash也能工作。

所有这些都与调用脚本的shell无关。重要的是脚本是用什么语言写的。

票数 12
EN

Unix & Linux用户

发布于 2018-12-29 07:03:37

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

如果您不想使用shebang,则需要指定应该执行脚本的内容。在您的例子中,应该是fish

fish myscript.sh

票数 5
EN

Unix & Linux用户

发布于 2020-12-13 00:03:03

  1. 以下方法也有效:sudo ./

在运行bash时,默认情况下,在大多数发行版中使用sudo命令。但是如果你不想改变脚本的话,可能是有原因的。

注意:这是解决这些问题的错误方法。以吉利斯的形式进行更改

票数 -2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/491419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档