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/env
arquivo 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/bash
ele não funcionará. #!/bin/env bash
funciona também.
O que está faltando no ambiente para permitir que o shebang portátil funcione?
ls -lL /usr/bin/env
retorna, ls: cannot access /usr/bin/env: No such file or directory
entã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.
shell-script
environment-variables
shebang
Conorgriffin
fonte
fonte
Respostas:
ls -lL /usr/bin/env
mostra 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/env
está correto se/usr
e/usr/bin
são os dois diretórios reais (não links simbólicos). Evidentemente, esse não é o caso em sua máquina. Talvez/usr
seja um link simbólico? (Evidentemente, não é um link simbólico/
, caso contrário,/usr/bin/env
seria 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:
Você pode torná-lo um link relativo, mas se o fizer, verifique se está correto. Alterne para
/usr/bin
e executels -l relative/path/to/bin/env
para 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.
fonte
/usr/bin
foi movido para outro sistema de arquivos e é um link simbólico para/vol_01/usr/bin
Aqui (Fedora 23)
/bin
é um link simbólico para/usr/bin
; se você tiver uma configuração semelhante, o link simbólico/usr/bin/env
comprará um loop infinito.Verifique os pacotes relevantes, por exemplo
rpm -qf /usr/bin/env /bin/env
, e reinstale-os (aquicoreutils
, por exemplo,yum reinstall coreutils
ou similares). Isso deve corrigir qualquer manuseio equivocado.fonte
coreutils
mas 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/env
que também existe. Portanto, não entendo por que esse link simbólico não funciona. Substituí o alvo para que ele aponte/bin/env
com um caminho absoluto e que parece ter funcionado./bin
era um link simbólico para/usr/bin
no sistema do conorgriffin, em seguida,/usr/bin/env
e/bin/env
seria o mesmo arquivo.