【问题标题】:Bash script: bad interpreterBash 脚本:错误的解释器
【发布时间】:2010-05-15 20:09:03
【问题描述】:

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

导出:错误的解释器:没有这样的文件或目录

当我执行这个 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

【问题讨论】:

  • 您是如何创建文件的?行尾是否正确?

标签: linux bash mono scripting


【解决方案1】:

第一行,#!/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

【讨论】:

  • 部分错误。我没有在 Windows 上创建它,我使用了 cat > filename。 dos2unix 也无法正常工作,但 gvim 显示了一些不寻常的字符。我复制粘贴到一个新文件 - 没有更改,它立即开始工作......
  • 注意,我相信 nano、emacs 和 vi 会自动剥离它。 OP 所要做的就是打开并使用上述任何一种方法保存它。
  • @Quandary,你使用 what ssh / 终端客户端创建了这个文件吗?什么终端类型?自 Novell Virtual Terminal 和 3270 环境以来,我还没有看到过这种问题。除了 cat 之外,您究竟用什么来创建文件?也许您正在使用脑死亡串行 -> TCP/IP 适配器?
  • 不,这是 bash shell @localhost
  • 显然,这在 macOS 上使用 TextEdit 创建 shell 脚本时也会受到影响。
【解决方案2】:

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

尝试在其上运行 dos2unix。

【讨论】:

  • 不,不是,我已经跑过 tofrodos。除了 \r\n 之外,问题出在其他一些字符上。奇怪...
  • 这些字符是什么?
【解决方案3】:

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

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

顺便说一句,脚本似乎设计为来源,即. ./mono-2.6-environment 而不是./mono-2.6-environment

【讨论】:

  • 好点,它需要采购。源单 2.6 环境或 . ./mono-2.6-environment
【解决方案4】:

遇到了同样的问题。使用蛮力:

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

&这成功了

(当然我想知道为什么)

【讨论】:

  • 当文件系统变得有趣时,有时会发生这种情况。尝试移动或重命名文件。如果您看到“过时的文件句柄”错误,这就是您的问题。解决方案: 。 .格式 c: :-D :-o
【解决方案5】:

我遇到了类似的错误,但在我的情况下,我忘记在 bin 之前添加 / 并且遇到了错误的解释器错误。也试过做 sudo apt-get install dos2unix -y package.

我原来是用这个的:

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

还要仔细检查路径。

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 哈哈,你是说,例如,西里尔字母 A 吗?是的,绝对有可能。
    • 没错。尝试运行:#!/usr/local/bin/рythοn。它不会像你想象的那样运行 python。 (另外,如果我的回答解决了您的问题,请将答案标记为正确:)
    【解决方案7】:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-18
        • 2019-03-11
        相关资源
        最近更新 更多