Bash 脚本:糟糕的解释器
- 2024-10-17 08:47:00
- admin 原创
- 66
问题描述:
问题:我收到此错误消息:
导出:错误的解释器:没有此文件或目录
当我执行这个 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
解决方案 1:
第一行,#!/bin/bash
,告诉 Linux 在哪里找到解释器。该脚本还应该可以使用 执行chmod +x script.sh
,看来您已经这样做了。
您很可能使用 Windows 编辑器创建了此文件,它会<cr><lf>
在每行末尾放置一个。这是 DOS/Windows 下的标准。OS X 会在每行末尾放置一个。然而,在 Unix/Linux 下,标准是在行末<cr>
放置一个。<lf>
Linux 现在正在寻找一个文件/bin/bash<cr>
来解释该文件,其中<cr>
是回车符,这是 Linux 下有效的文件字符。这样的文件不存在。因此出现错误。
解决方案:使用 Linux 上的编辑器编辑该文件并删除多余的<cr>
。在 Windows 上编辑该文件时通常有效的一个工具是dos2unix
。
解决方案 2:
脚本可以使用 Dos 换行符吗?
尝试在其上运行 dos2unix。
解决方案 3:
看起来已经配置了一些东西来以某种方式覆盖内置函数。例如,export
这可以通过导出函数或内置函数来完成。尝试放入脚本进行检查。如果您正在设置,您可能不应该这样做。enable
`type export`BASH_ENV
如果 bash 以 形式调用sh
,它将启用 POSIX 模式,并且不允许export
使用函数覆盖,这是 POSIX 的要求。同样,大多数以/bin/sh
形式安装的其他 shell 也遵循 POSIX 的规定,并且/或者不允许通过从环境中导入函数来严重破坏脚本的执行环境。
顺便说一句,该脚本似乎设计为源,即. ./mono-2.6-environment
而不是./mono-2.6-environment
。
解决方案 4:
/
我遇到了类似的错误,但就我而言,我之前忘了添加bin
,所以遇到了错误的解释器错误。也尝试过sudo apt-get install dos2unix -y package
。
我最初用的是这个:
#! bin/bash ( i was missing / before bin )
再次检查路径。
解决方案 5:
遇到了同样的问题。使用了暴力破解:
/bin/sh /full/path/to/configure --options
&这个招数成功了
(当然我想知道为什么)
解决方案 6:
对我有用的是当我使用的系统上没有 dos2Unix 时:
sed -i s/{ctrl+v}{ctrl+m}// filename
解决方案 7:
这可能是shebang 中含有同形 unicode 字符的情况。换句话说,shebang 中可能存在不可见或相似的字符,而这些字符实际上并不代表字符串#!/bin/bash
。请尝试在十六进制编辑器中查看这些字符。
解决方案 8:
当文件系统出现问题时,有时会发生这种情况。尝试移动或重命名文件。如果您看到“过时的文件句柄”错误,那么这就是您的问题。
例如,我们在 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 容器,或者文件系统修复磁盘可能会有帮助,或者当然format c:
:-D :-o
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件