¿Por qué #! / Usr / bin / env bash no funciona en mi sistema?

11

Me encontré con algunos problemas al ejecutar algunos scripts de instalación donde se quejaron bad interpreter.

Así que hice un ejemplo trivial pero no puedo entender cuál es el problema, ver más abajo.

#!/usr/bin/env bash
echo "hello"

La ejecución de la secuencia de comandos anterior da como resultado el siguiente error

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

El /usr/bin/envarchivo existe, ver abajo:

[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]#

Si modifico el script para usar el shebang normal, #!/bin/bashno funciona. #!/bin/env bashfunciona igual de bien

¿Qué le falta al entorno para permitir que el shebang portátil funcione?

ls -lL /usr/bin/envvuelve ls: cannot access /usr/bin/env: No such file or directoryasí que supongo que necesito alterar el enlace simbólico? ¿Puedo señalarlo /bin/env?

env --version es 8.4 y el sistema operativo es Red Hat Enterprise Linux Server versión 6.6.

conorgriffin
fuente
1
Por lo general, esto se debe a las terminaciones de retorno de carro / avance de línea en las líneas. Alternativamente: ubicación de env .
Thomas Dickey

Respuestas:

7

ls -lL /usr/bin/envmuestra que el enlace simbólico está roto. Eso explica por qué la línea shebang no está funcionando: el kernel está intentando, y obviamente falla, ejecutar un enlace simbólico colgante.

/usr/bin/env -> ../../bin/enves correcto si /usry /usr/binson directorios reales (no enlaces simbólicos). Evidentemente, este no es el caso en su máquina. Tal vez /usres un enlace simbólico? (Evidentemente no es un enlace simbólico /, de lo contrario /usr/bin/envsería el mismo archivo que /bin/env, no un enlace simbólico).

Necesitas arreglar ese enlace simbólico. Puedes convertirlo en un enlace absoluto:

sudo ln -snf /bin/env /usr/bin/env

Puede convertirlo en un enlace relativo, pero si lo hace, asegúrese de que sea correcto. Cambia /usr/biny ejecuta ls -l relative/path/to/bin/envpara confirmar que lo has hecho bien antes de crear el enlace simbólico.

Esta no es una configuración predeterminada de RHEL, por lo que debe haber modificado algo localmente. Trate de averiguar qué hizo y si eso pudo haber causado otros problemas similares.

Gilles 'SO- deja de ser malvado'
fuente
Esto es correcto, /usr/binse movió a otro sistema de archivos y es un enlace simbólico a/vol_01/usr/bin
conorgriffin
-1

Aquí (Fedora 23) /binhay un enlace simbólico a /usr/bin; Si tiene una configuración similar, el enlace simbólico /usr/bin/envsimplemente le compra un bucle infinito.

Verifique los paquetes relevantes, es decir rpm -qf /usr/bin/env /bin/env, y vuelva a instalarlos (aquí coreutils, es decir, yum reinstall coreutilso similar). Eso debería arreglar cualquier mal manejo.

vonbrand
fuente
Ya reinstalé coreutilspero eso no hizo ninguna diferencia. Es muy raro /usr/bin/enves un enlace simbólico con una ruta relativa a su objetivo ../../bin/env. Entonces eso debería ser lo /bin/envque también existe. Así que no entiendo por qué ese enlace simbólico no funciona. Reemplacé el objetivo para que apunte /bin/envcon un camino absoluto y eso parece haber funcionado.
conorgriffin
Si /binhabía un vínculo simbólico para /usr/binel sistema de conorgriffin, a continuación, /usr/bin/envy /bin/envsería el mismo archivo.
Gilles 'SO- deja de ser malvado'