Bash脚本:解释器错误

33

问题:我收到了以下错误信息:

export: bad interpreter: No such file or directory

当我执行以下bash脚本时:

#!/bin/bash
MONO_PREFIX=/opt/mono-2.6
GNOME_PREFIX=/opt/gnome-2.6
export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH
export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include
export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal
export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig:$GNOME_PREFIX/lib/pkgconfig
PATH=$MONO_PREFIX/bin:$PATH
PS1="[mono-2.6] \w @ "

但是bash路径似乎是正确的:

asshat@IS1300:~/sources/mono-2.6# which bash
/bin/bash

asshat@IS1300:~# cd sources/
asshat@IS1300:~/sources# cd mono-2.6/
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment
export: bad interpreter: No such file or directory
asshat@IS1300:~/sources/mono-2.6# ls
download  mono-2.4  mono-2.4-environment  mono-2.6  mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6# cp mono-2.6-environment mono-2.6-environment.sh
asshat@IS1300:~/sources/mono-2.6# ./mono-2.6-environment.sh
export: bad interpreter: No such file or directory
asshat@IS1300:~/sources/mono-2.6# ls
download  mono-2.4-environment  mono-2.6-environment
mono-2.4  mono-2.6              mono-2.6-environment.sh
asshat@IS1300:~/sources/mono-2.6# bash mono-2.6-environment
asshat@IS1300:~/sources/mono-2.6#
我做错了什么?还是这是Lucid Lynx的bug? 我执行了chmod +x

你是如何创建这个文件的?行尾符是否正确? - wlashell
8个回答

58
第一行的#!/bin/bash告诉Linux要找到解释器。此脚本还应使用chmod +x script.sh可执行,看起来您已经这样做了。
很可能您使用Windows编辑器创建了此文件,它会在每行末尾放置一个<cr><lf>,这是dos / windows下的标准,OS X会在每行末尾放置<cr>,但在Unix / Linux下,标准是仅在行末尾放置<lf>
Linux现在正在寻找名为/bin/bash<cr>的文件来解释该文件,其中<cr>是回车字符,在Linux下是一个有效的文件字符。这样的文件不存在。因此出现错误。
解决方案:使用Linux上的编辑器编辑文件并去掉多余的<cr>。当在Windows上编辑文件时,通常适用的工具是dos2unix

1
部分错误。我没有在Windows上创建它,我使用了cat > 文件名。dos2unix也不能使其工作,但gvim显示了一些不寻常的字符。我将其复制粘贴到一个新文件中-没有进行任何更改,它立即开始工作了... - Stefan Steiger
2
注意,我相信nano、emacs和vi会在打开并保存文件后自动去除这个字符。OP所需要做的就是用以上任意一种编辑器打开并保存该文件。 - Tim Post
@Quandary,你用什么ssh/终端客户端创建了这个文件?终端类型是什么?自从Novell Virtual Terminal和3270环境以来,我就没有见过这种问题。除了cat之外,你到底用了什么来创建这个文件?也许你正在使用一个脑残的串口->TCP/IP适配器? - Tim Post
1
不,那是bash shell @localhost - Stefan Steiger
在 macOS 上使用 TextEdit 创建 shell 脚本时,这也会出现问题。 - bhaller

11

这个脚本是否使用DOS换行符?

尝试在其上运行dos2unix。


不是这样的,我已经运行了tofrodos。问题在于除了\r\n之外还有其他字符。很奇怪... - Stefan Steiger
1
这些字符是什么? - christophetd

3

我遇到了类似的错误,但我的情况是在bin之前忘记添加/,导致出现了错误解释器。我还尝试执行sudo apt-get install dos2unix -y package

我最初使用的是:

#! bin/bash ( i was missing / before bin )

同时仔细检查路径。


3
看起来已经以某种方式配置了覆盖export内置的设置。例如,可以通过导出函数或enable内置来完成此操作。尝试在脚本中输入type export进行检查。如果您正在设置BASH_ENV,则可能不应该这样做。
如果将bash称为sh,它会启用POSIX模式,并且不允许通过函数覆盖export,这是POSIX所要求的。同样,大多数其他安装为/bin/sh的shell都遵循POSIX,并/或者不允许通过从环境中导入函数来强烈干扰脚本的执行环境。
顺便说一下,该脚本似乎设计为被源引用,即. ./mono-2.6-environment而不是./mono-2.6-environment

好的,这需要引用。请引用mono-2.6-environment或者使用命令". ./mono-2.6-environment"。 - Stefan Steiger

2

我遇到了同样的问题。采用了暴力破解的方法:

/bin/sh /full/path/to/configure --options

& 这就解决了问题。

(当然我也想知道为什么)


有时候文件系统出现问题会导致这种情况发生。尝试移动或重命名文件。如果你看到“Stale file handle”错误,那么这就是你的问题。解决方案:. . 格式化 c: :-D :-o - gaoithe

0

对我有用的是当我使用的系统上没有安装dos2Unix:

sed -i s/{ctrl+v}{ctrl+m}// filename

0

这可能是具有同形异义Unicode字符的shebang的情况。换句话说,您的shebang中可能存在看不见或类似的字符,实际上并不代表字符串#!/bin/bash。尝试在十六进制编辑器中查看这些字符。


1
哈哈,你是说,比如西里尔字母A?是的,这是一个明确的可能性。 - Stefan Steiger
没错。尝试运行这个:#!/usr/local/bin/рythοn。它不会像你想的那样运行Python。(另外,如果我的答案解决了你的问题,请将答案标记为正确 :)) - Natan Yellin

-1
有时候文件系统出现问题会导致这种情况发生。 尝试移动或重命名文件。 如果您看到“Stale file handle”错误,那么这就是您的问题。
例如,在CentOS docker中发生了这种情况。
$ ./test.sh 
-bash: ./test.sh: /bin/bash: bad interpreter: Invalid argument
$ ls -alstr test.sh 
20 -r-xr-xr-x 0 omen omen 17874 Jun 20 01:36 test.sh
$ cp test.sh testcopy.sh
$ ./testcopy.sh
Happy Days

$ mv test.sh footest.sh
mv: cannot move ‘test.sh’ to ‘footest.sh’: Stale file handle
$ rm test.sh 
rm: cannot remove ‘test.sh’: Stale file handle

你可以复制文件并阅读它。 但是不能移动它! 也不能删除它。 可能是一些奇怪的Docker文件系统问题。

解决方案:重新创建Docker容器,或者可能使用文件系统修复磁盘会有帮助, 当然还可以格式化C: :-D :-o


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接