在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兼容。
知道吗?
发布于 2018-12-29 10:27:51
如果可执行文件不能由内核本地运行,则需要一个shebang行。内核只能以特定格式运行机器代码(大多数Unix变体上是小精灵),有时也只能运行其他格式(例如,在Linux上,可以通过宾夫姆_其他注册可执行格式)。如果可执行文件需要一个翻译员,那么内核需要知道要调用哪个解释器。这就是谢邦
如果您的脚本是鱼语法,那么它的第一行必须是
#!/usr/bin/env fish
(您可以使用绝对路径,但是如果要在fish
可执行文件位于不同位置的机器上运行脚本,则必须修改脚本,例如/usr/bin/fish
vs /usr/local/bin/fish
。)
如果您的脚本使用sh语法,请使用
#!/bin/sh
(所有现代Unix系统在/bin/sh
上都有POSIX sh,因此不需要env
。)
如果您的脚本使用bash语法( sh加上一些bash特定的扩展),请使用
#!/usr/bin/env bash
在Linux上,实际上,#!/bin/bash
也能工作。
所有这些都与调用脚本的shell无关。重要的是脚本是用什么语言写的。
发布于 2018-12-29 07:03:37
为了通过引用脚本路径来执行脚本,您需要有一个shebang。否则,操作系统将尝试执行它,但会失败,因为它不是二进制可执行文件。
如果您不想使用shebang,则需要指定应该执行脚本的内容。在您的例子中,应该是fish
。
fish myscript.sh
发布于 2020-12-13 00:03:03
https://unix.stackexchange.com/questions/491419
复制相似问题