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 版。
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 设置,因此您必须在本地修改了某些内容。试着找出你做了什么,以及这是否会导致其他类似的问题。