为什么 #!/usr/bin/env bash 在我的系统上不起作用?

为什么 #!/usr/bin/env bash 在我的系统上不起作用?

在运行他们抱怨的一些安装脚本时,我遇到了一些问题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或类似的)。这应该可以解决任何误导性的处理方式。

相关内容