Bash脚本:糟糕的解释器

时间:2010-05-15 20:09:03

标签: linux bash mono scripting

问题:我收到此错误消息:

  

export:bad interpreter:没有这样的文件   或目录

当我执行这个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的错误?

我做了chmod + x

8 个答案:

答案 0 :(得分:37)

第一行#!/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 :(得分:8)

脚本可以使用Dos换行符吗?

尝试在其上运行dos2unix。

答案 2 :(得分:2)

看起来事情已被配置为以某种方式覆盖export内置。例如,这可以通过导出的函数或enable内置函数来完成。尝试将type export放入脚本中进行检查。如果您要设置BASH_ENV,则可能不应该这样做。

如果将bash称为sh,它将启用POSIX模式,并且不允许使用函数覆盖export,这是POSIX所要求的。同样,安装为/bin/sh的大多数其他shell在此处遵循POSIX和/或不允许脚本的执行环境如同通过从环境导入函数那样强烈混乱。

顺便说一句,该脚本似乎是采购的,即. ./mono-2.6-environment而不是./mono-2.6-environment

答案 3 :(得分:1)

有同样的问题。使用蛮力:

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

&安培;这样做了伎俩

(当然我想知道原因)

答案 4 :(得分:0)

你是否像这样运行它(你确实提到了chmod + x)

. /path/to/it

或者像这样:

./it

我怀疑你的代码是在一个新的进程中执行的,而你告诉它的一切都丢失了。因此,变量不会在当前 shell中展开。但是,这并不能解释您看到的错误解释器错误。我认为你也有一个终端问题(如在终端中,你曾与cat交谈)。

你的提示没有做到这一点的事实:

`PS1="[mono-2.6] \w @` "

让我觉得你跑了,而不是来源代码。它们是有区别的。我无法得到你发布的内容。

答案 5 :(得分:0)

对我有用的是当dos2Unix不在我正在使用的系统上时:

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

答案 6 :(得分:0)

有时在文件系统变得有趣时会发生这种情况。 尝试移动或重命名文件。 如果您看到“过时的文件句柄”错误,这就是您的问题。

例如CentOS docker发生了我们

GridLayoutGroup

您可以复制文件并阅读。 但是不要动它! 也不要删除它。 也许有些奇怪的docker文件系统问题。

解决方案::重新创建Docker容器,或者文件系统修复磁盘会有所帮助 OR当然是$ ./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 :-D:-o

答案 7 :(得分:0)

可能是a shebang with homoglyphic unicode characters的情况。换句话说,您可能在shebang中使用了不可见或相似的字符,这些字符实际上并不表示字符串#!/bin/bash。尝试在十六进制编辑器中查看字符。