Почему #! / Usr / bin / env bash не работает в моей системе?

11

Я столкнулся с некоторыми проблемами при запуске некоторых сценариев установки, на которые они жаловались 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]#

Если я изменю сценарий на использование обычного шебанга, #!/bin/bashэто не проблема. #!/bin/env bashработает так же.

Чего не хватает в окружающей среде, чтобы позволить портативному шебангу работать?

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.

conorgriffin
источник
1
Обычно это связано с окончаниями возврата каретки / перевода строки в строках. Альтернативно: расположение окр .
Томас Дики

Ответы:

7

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, поэтому вы должны были что-то изменить локально. Постарайтесь выяснить, что вы сделали, и могло ли это вызвать другие подобные проблемы.

Жиль "ТАК - прекрати быть злым"
источник
Это правильно, он /usr/binбыл перенесен в другую файловую систему и является символической ссылкой на/vol_01/usr/bin
conorgriffin
-1

Здесь (Fedora 23) /binесть символическая ссылка на /usr/bin; Если у вас есть аналогичные настройки, символическая ссылка /usr/bin/envпросто покупает вам бесконечный цикл.

Проверьте соответствующие пакеты, т. rpm -qf /usr/bin/env /bin/envЕ. И переустановите их (здесь coreutils, т. Е. yum reinstall coreutilsИли аналогичные). Это должно исправить любое ошибочное обращение с людьми.

vonbrand
источник
Я уже переустанавливал, coreutilsно это не имело значения. Это довольно странно. /usr/bin/envявляется символической ссылкой с относительным путем к ее цели ../../bin/env. Так должно быть и то, /bin/envчто тоже существует. Поэтому я не понимаю, почему эта символическая ссылка не работает. Я заменил цель, чтобы она указывала на /bin/envабсолютный путь, и это, похоже, сработало.
Коноргрифин
Если бы /binбыла символическая ссылка /usr/binна систему Коноргриффина, то /usr/bin/envи /bin/envбыл бы тот же файл.
Жиль "ТАК ... перестать быть злым"