Por que o #! / Usr / bin / env bash não está funcionando no meu sistema?

11

Encontrei alguns problemas ao executar alguns scripts de instalação nos quais eles se queixavam bad interpreter.

Então fiz um exemplo trivial, mas não consigo descobrir qual é o problema, veja abaixo.

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

A execução do script acima resulta no seguinte erro

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

O /usr/bin/envarquivo existe, veja abaixo:

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

Se eu alterar o script para usar o shebang normal, #!/bin/bashele não funcionará. #!/bin/env bashfunciona também.

O que está faltando no ambiente para permitir que o shebang portátil funcione?

ls -lL /usr/bin/envretorna, ls: cannot access /usr/bin/env: No such file or directoryentão acho que preciso alterar o link simbólico? Posso apontar para isso /bin/env?

env --version é 8.4 e o sistema operacional é o Red Hat Enterprise Linux Server versão 6.6.

Conorgriffin
fonte
1
Geralmente, isso ocorre devido às terminações de retorno de carro / alimentação de linha nas linhas. Alternativamente: localização do env .
Thomas Dickey

Respostas:

7

ls -lL /usr/bin/envmostra que o link simbólico está quebrado. Isso explica por que a linha shebang não está funcionando: o kernel está tentando, e obviamente falhando, executar um link simbólico pendente.

/usr/bin/env -> ../../bin/envestá correto se /usre /usr/binsão os dois diretórios reais (não links simbólicos). Evidentemente, esse não é o caso em sua máquina. Talvez /usrseja um link simbólico? (Evidentemente, não é um link simbólico /, caso contrário, /usr/bin/envseria o mesmo arquivo que /bin/env, não um link simbólico).

Você precisa corrigir esse link simbólico. Você pode torná-lo um link absoluto:

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

Você pode torná-lo um link relativo, mas se o fizer, verifique se está correto. Alterne para /usr/bine execute ls -l relative/path/to/bin/envpara confirmar que você acertou antes de criar o link simbólico.

Esta não é uma configuração padrão do RHEL, portanto, você deve ter modificado algo localmente. Tente descobrir o que você fez e se isso poderia ter causado outros problemas semelhantes.

Gilles 'SO- parar de ser mau'
fonte
Isso está correto, /usr/binfoi movido para outro sistema de arquivos e é um link simbólico para/vol_01/usr/bin
conorgriffin
-1

Aqui (Fedora 23) /biné um link simbólico para /usr/bin; se você tiver uma configuração semelhante, o link simbólico /usr/bin/envcomprará um loop infinito.

Verifique os pacotes relevantes, por exemplo rpm -qf /usr/bin/env /bin/env, e reinstale-os (aqui coreutils, por exemplo, yum reinstall coreutilsou similares). Isso deve corrigir qualquer manuseio equivocado.

vonbrand
fonte
Eu já reinstalei, coreutilsmas isso não fez diferença. É bem estranho. /usr/bin/envé um link simbólico com um caminho relativo ao seu destino ../../bin/env. Então deve ser o /bin/envque também existe. Portanto, não entendo por que esse link simbólico não funciona. Substituí o alvo para que ele aponte /bin/envcom um caminho absoluto e que parece ter funcionado.
conorgriffin
Se /binera um link simbólico para /usr/binno sistema do conorgriffin, em seguida, /usr/bin/enve /bin/envseria o mesmo arquivo.
Gilles 'SO- stop be evil'