Perché #! / Usr / bin / env bash non funziona sul mio sistema?


11

Ho riscontrato alcuni problemi durante l'esecuzione di alcuni script di installazione di cui si sono lamentati bad interpreter.

Quindi ho fatto un esempio banale ma non riesco a capire quale sia il problema, vedi sotto.

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

L'esecuzione dello script precedente provoca il seguente errore

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

Il /usr/bin/envfile esiste, vedi sotto:

[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 modifico lo script per usare il normale shebang, #!/bin/bashnon funziona. #!/bin/env bashfunziona anche.

Cosa manca all'ambiente per consentire al shebang portatile di funzionare?

ls -lL /usr/bin/envritorna ls: cannot access /usr/bin/env: No such file or directoryquindi suppongo di dover modificare il link simbolico? Posso indicarlo /bin/env?

env --version è 8.4 e il sistema operativo è Red Hat Enterprise Linux Server versione 6.6.


1
Di solito ciò è dovuto alle terminazioni di ritorno a capo / avanzamento riga sulle righe. In alternativa: posizione di env .
Thomas Dickey,

Risposte:


7

ls -lL /usr/bin/envmostra che il collegamento simbolico è interrotto. Questo spiega perché la linea shebang non funziona: il kernel sta cercando, e ovviamente non riesce, di eseguire un collegamento simbolico penzolante.

/usr/bin/env -> ../../bin/envè corretto se /usre /usr/binsono entrambe directory effettive (non collegamenti simbolici). Evidentemente questo non è il caso sulla tua macchina. Forse /usrè un collegamento simbolico? (Evidentemente non è un collegamento simbolico a /, altrimenti /usr/bin/envsarebbe lo stesso file di /bin/env, non un collegamento simbolico).

Devi correggere quel link simbolico. Puoi renderlo un collegamento assoluto:

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

Puoi renderlo un collegamento relativo, ma se lo fai, assicurati che sia corretto. Passa a /usr/bined esegui ls -l relative/path/to/bin/envper confermare che hai capito bene prima di creare il link simbolico.

Questa non è un'impostazione predefinita di RHEL, quindi devi aver modificato qualcosa localmente. Prova a scoprire cosa hai fatto e se ciò avrebbe potuto causare altri problemi simili.


Questo è corretto, è /usr/binstato spostato in un altro file system ed è un collegamento simbolico a/vol_01/usr/bin
conorgriffin,

-1

Qui (Fedora 23) /binc'è un collegamento simbolico a /usr/bin; se hai un'impostazione simile, il link simbolico da /usr/bin/envti compra solo un ciclo infinito.

Controllare i pacchetti pertinenti, ad es. rpm -qf /usr/bin/env /bin/env, E reinstallarli (qui coreutils, ad es. yum reinstall coreutilsO simili). Ciò dovrebbe correggere eventuali maltrattamenti.


Ho già reinstallato coreutilsma quello non ha fatto differenza. È abbastanza strano. /usr/bin/envè un collegamento simbolico con un percorso relativo al suo obiettivo ../../bin/env. Quindi dovrebbe essere quello /bin/envche esiste anche. Quindi non capisco perché quel collegamento simbolico non funzioni. Ho sostituito l'obiettivo in modo che indichi /bin/envcon un percorso assoluto e che sembra aver funzionato.
Conorgriffin,

Se /binfosse un collegamento simbolico al /usr/binsistema di conorgriffin, allora /usr/bin/enve /bin/envsarebbe lo stesso file.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.