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

con*_*fin 15 shell-script environment-variables shebang

我在运行一些他们抱怨的安装脚本时遇到了一些问题bad interpreter

所以我做了一个简单的例子,但我无法弄清楚问题是什么,见下文。

#!/usr/bin/env bash
echo "hello"
Run Code Online (Sandbox Code Playgroud)

执行上面的脚本会出现以下错误

[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

/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]#
Run Code Online (Sandbox Code Playgroud)

如果我更改脚本以使用常规的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 版。

Gil*_*il' 6

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
Run Code Online (Sandbox Code Playgroud)

您可以将其设为相对链接,但如果这样做,请确保它是正确的。在创建符号链接之前,切换到/usr/bin并运行ls -l relative/path/to/bin/env以确认您已经正确。

这不是默认的 RHEL 设置,因此您必须在本地修改了某些内容。试着找出你做了什么,以及这是否会导致其他类似的问题。