Чому #! / 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.


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Або подібні). Це має виправити будь-яке неправильне поводження.


Я вже перевстановився, coreutilsале це не мало значення. Це досить дивно. /usr/bin/envє символічним зв'язком з відносним шляхом до цілі ../../bin/env. Так що має бути і те, /bin/envщо існує. Тож я не розумію, чому це символічне посилання не працює. Я замінив ціль, щоб вона вказувала на /bin/envабсолютний шлях, і це, здається, спрацювало.
conorgriffin

Якщо /binв /usr/binсистемі conorgriffin було символічне посилання , то /usr/bin/envі /bin/envбув би той самий файл.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.