在运行他们抱怨的一些安装脚本时,我遇到了一些问题bad interpreter
。
所以我做了一个简单的例子,但我无法弄清楚问题是什么,见下文。
#!/usr/bin/env bash
echo "hello"
执行上面的脚本会出现以下错误
[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
该/usr/bin/env
文件存在,见下图:
[root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env
lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env
[root@ech-10-24-130-154 dc-user]# ls -l /bin/env
-rwxr-xr-x 1 root root 23832 Jul 16 2014 /bin/env
[root@ech-10-24-130-154 dc-user]#
如果我更改脚本以使用常规 shebang,#!/bin/bash
它就没有问题。#!/bin/env bash
也有效。
环境中缺少什么才能让便携式 Shebang 工作?
ls -lL /usr/bin/env
返回ls: cannot access /usr/bin/env: No such file or directory
所以我想我需要更改符号链接?我可以指点一下/bin/env
吗?
env --version
是 8.4,操作系统是 Red Hat Enterprise Linux Server 版本 6.6。
答案1
ls -lL /usr/bin/env
表明符号链接已损坏。这就解释了为什么 shebang 行不起作用:内核正在尝试执行悬空符号链接,但显然失败了。
/usr/bin/env -> ../../bin/env
/usr
如果和/usr/bin
都是实际目录(不是符号链接),则正确。显然,您的机器上并非如此。也许/usr
是一个符号链接? (显然它不是 的符号链接/
,否则/usr/bin/env
将是与 相同的文件/bin/env
,而不是符号链接)。
您需要修复该符号链接。您可以将其设为绝对链接:
sudo ln -snf /bin/env /usr/bin/env
您可以将其设为相对链接,但如果这样做,请确保其正确。在创建符号链接之前,切换到/usr/bin
并运行ls -l relative/path/to/bin/env
以确认您已正确设置。
这不是默认的 RHEL 设置,因此您必须在本地修改某些内容。尝试找出您所做的事情以及这是否会导致其他类似的问题。
答案2
所以...我遇到了类似的错误,但是没有找到 /usr/bin/sh ,并且还告诉我在运行它时找不到我尝试运行的脚本!我验证了 sh 在 /usr/bin 中的位置,所以很困惑,来到这里寻找答案......
就我而言,我在 UltraEdit 中进行编辑时忘记将 DOS CR LF 转换为 Unix LF。卫生部!
一旦我这样做并重新导入脚本,它发现 sh 很好。我还有其他问题需要解决,但这个神秘问题已经解决了。
答案3
这里(Fedora 23)/bin
是一个符号链接/usr/bin
;如果您有类似的设置,则符号链接只会/usr/bin/env
为您带来无限循环。
检查相关的软件包,即rpm -qf /usr/bin/env /bin/env
,并重新安装它们(此处coreutils
,即,yum reinstall coreutils
或类似的)。这应该可以解决任何误导性的处理方式。