#! / bin / bash - nessun file o directory


70

Ho creato uno script bash ma quando provo a eseguirlo, ottengo

#!/bin/bash no such file or directory

Devo eseguire il comando: bash script.shaffinché funzioni.

Come posso risolvere questo problema?


Ora ho questo problema sotto Cygwin con uno script che potrei giurare che era già in esecuzione senza problemi. Ho controllato tutte le risposte, ma nessuna sembra adattarsi. Altre domande e risposte hanno anche menzionato problemi a 32/64 bit, ma per gli script di shell questo potrebbe essere escluso, giusto?
gennaio

Trovato il motivo, aggiunto dettagli nella nuova anwer unix.stackexchange.com/a/450389/62636 nel caso in cui qualcuno abbia usato anche #!/usr/bin/env bashinvece di #!/bin/bashe anche guardando qui ...
gennaio

Risposte:


100

Questo tipo di messaggio è generalmente dovuto a una falsa riga shebang, o un ritorno a capo extra alla fine della prima riga o una distinta base all'inizio di essa.

Correre:

$ head -1 yourscript | od -c

e guarda come finisce.

Questo è sbagliato:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Anche questo è sbagliato:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Questo è corretto:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Utilizzare dos2unix(o sed, tr, awk, perl, python...) per risolvere il tuo script, se questo è il problema.

Eccone uno che rimuoverà sia una DBA che i CR di coda:

sed -i '1s/^.*#//;s/\r$//' brokenScript


Si noti che la shell che si sta utilizzando per eseguire lo script influirà leggermente sui messaggi di errore visualizzati.

Ecco tre script che mostrano solo il loro nome ( echo $0) e hanno le seguenti rispettive righe di shebang:

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Sotto bash, eseguendoli verranno mostrati questi messaggi:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

L'esecuzione di quelli falsi chiamando esplicitamente l'interprete consente l'esecuzione dello script CRLF senza alcun problema:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Ecco il comportamento osservato sotto ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

e sotto dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
Un altro modo di rivelare se questo è il problema è hexdump -C yourscript | head -n 1. Userei ancora dos2unix yourscriptper ripararlo.
Kevin M,

Sì, potrebbe benissimo essere quello. Ho modificato su Windows. Cose per la mancia.
Nicolas de Fontenay il

1
Se si trattasse di un problema CRLF, non visualizzerai un #!/bin/bash no such file or directorymessaggio di errore, in quanto non c'è motivo per tentare di eseguire o aprire qualcosa #!/bin/bash. È /bin/bash<CR>quello che verrebbe eseguito.
Stéphane Chazelas il

1
@StephaneChazelas Dato che dos2unix ha risolto il problema, non c'è dubbio che non fosse un problema CRLF. Il messaggio di errore è stato probabilmente trascritto in modo non
corretto

6
dos2unixrimuove anche una DBA UTF-8. Una DBA UTF-8 avrebbe potuto spiegare il messaggio di errore.
Stéphane Chazelas,


9

In realtà, lo shebang giusto per lo script bash è questo:

#!/usr/bin/env bash

Perché, in freeBSD, bash si trova in /usr/local/bin/bash


13
"giusto" è una parola difficile da usare in questi casi. Forse una frase migliore sarebbe "meno soggetta a errori".
HalosGhost,

1
Anche questo è terribile; l'ipotesi che / usr esista è una cattiva IMO. Haiku, ad esempio, non ha / usr.
jessicah,

9

Puoi usare vi per risolvere entrambi i problemi se esistono:

vi <your_file>
:set ff=unix
:set nobomb
:wq

Le risposte dovrebbero essere autosufficienti il ​​più possibile. La domanda non menziona due problemi; se hai intenzione di basarti su altre risposte, dovresti almeno dire quali sono. Meglio ancora, dovresti spiegare come questo risponde alla domanda.
G-Man,

Soluzione molto rapida senza scaricare altri strumenti di Windows, grazie!
vapore

1
@ G-Man Altre risposte lo menzionano già in modo molto più dettagliato di quello che vorrei approfondire. Non è necessario ripeterlo, ma se non è dolorosamente ovvio, puoi avere un finale di riga di Windows e un carattere BOM di Windows nascosto. Penso che molte persone che scansionano le risposte apprezzino la brevità invece di essere autosufficienti, specialmente quando ci sono molti più dettagli in altre risposte.
Cwash,

4

Se non hai dos2unix questo è un modo per risolvere questo problema.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

Marchio ordine byte (DBA)

Ciò potrebbe essere causato da una DBA. Da Wikipedia, una DBA è una

Il segno di ordine dei byte (BOM) è un carattere Unicode, un segno di ordine dei byte U + FEFF (BOM), il cui aspetto come un numero magico all'inizio di un flusso di testo può segnalare diverse cose a un programma che consuma il testo

Sfortunatamente, non segnala nulla al kernel Linux che gestisce la linea she-bang. Puoi verificare di avere una DBA utilizzando file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Oppure puoi eseguire il dump esadecimale dei primi pochi caratteri e vedere se corrispondono a uno qualsiasi dei caratteri della DBA manualmente

Puoi eliminare i caratteri della distinta base dopo averli conosciuti in questo modo,

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

Ho avuto il problema aggiungendo accidentalmente un eseguibile bash errato al PATHe perché nel mio script è #!/usr/bin/env bashstato usato lo shebang più flessibile (prendi il primo eseguibile bash dal percorso).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Ho installato GIT per Windows per collaborare cygwincon le GUI di Windows GIT (non funzionava con git nativo di Cygwin ...). Ho risolto questo problema passando a #!/bin/bashSheband e rimuovendo GIT per Windows PATH.


-3

Provare #!/bin/bash

Seconda cosa: find / -name bash
terza cosa:ls -al /bin/bash


O semplicemente which bash. Sappiamo che ne sta trovando uno perché funziona bash script.sh.
Kevin,

Vero. E come detto, c'è il metodo molto più portatile / usr / bin / env per avere un programma per individuare bash (o un altro interprete) per te. Non c'è bisogno di codificare un pah.
Hennes,
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.