问题:我收到此错误消息:
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
答案 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
。尝试在十六进制编辑器中查看字符。