Am creat un script bash, dar când încerc să îl execut, primesc
#!/bin/bash no such file or directory
Trebuie să rulez comanda: bash script.sh
pentru a funcționa.
Cum pot remediați acest lucru?
Comentarii
- Am această problemă acum sub cygwin cu un script despre care aș putea jura că rulează deja fără probleme. Am verificat toate răspunsurile, dar niciunul nu pare să se potrivească. Alte întrebări și răspunsuri au menționat, de asemenea, probleme de 32/64 biți, dar pentru scripturile shell acest lucru ar putea fi exclus, nu?
- Am găsit motivul, am adăugat detalii în noua anwer 6a1a7668cb „>
unix.stackexchange.com/a/450389/62636 în cazul în care cineva a folosit și#!/usr/bin/env bash
în loc de#!/bin/bash
și căutând și aici …
Răspuns
Acest tip de mesaj se datorează de obicei o linie falsă de shebang, fie o întoarcere de trăsură suplimentară la capătul bradului st line sau un BOM la începutul acestuia.
Rulați:
$ head -1 yourscript | od -c
și vedeți cum se termină.
Acest lucru este greșit:
0000000 # ! / b i n / b a s h \r \n
Și asta este greșit:
0000000 357 273 277 # ! / b i n / b a s h \n
Acest lucru este corect:
0000000 # ! / b i n / b a s h \n
Utilizați dos2unix
(sau sed
, tr
, awk
, perl
, python
…) pentru a remedia scriptul în cazul în care acesta este problema.
Iată unul care va elimina atât un BOM, cât și CR-urile:
sed -i "1s/^.*#//;s/\r$//" brokenScript
Rețineți că shell-ul pe care îl utilizați pentru a rula scriptul va afecta ușor mesajele de eroare afișate.
Iată trei scripturi care doar arată numele lor (echo $0
) și având următoarele linii shebang respective:
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
Sub bash, rularea acestora va afișa aceste mesaje:
$ ./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
Rularea bo gus ones, apelând în mod explicit interpretul, permite scriptului CRLF să ruleze fără nicio problemă:
$ bash ./scriptWithCRLF ./scriptWithCRLF $ bash ./scriptWithBom ./scriptWithBom: line 1: #!/bin/bash: No such file or directory ./scriptWithBom
Iată comportamentul observat sub ksh
:
$ ./scriptWithCRLF ksh: ./scriptWithCRLF: not found [No such file or directory] $ ./scriptWithBom ./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory] ./scriptWithBom
și sub dash
:
$ ./scriptWithCRLF dash: 2: ./scriptWithCRLF: not found $ ./scriptWithBom ./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found ./scriptWithBom
Comentarii
- Un alt mod de a dezvălui dacă aceasta este problema este
hexdump -C yourscript | head -n 1
. Aș folosi în continuaredos2unix yourscript
pentru a o remedia. - Dacă ar fi o problemă CRLF, nu ați ‘ nu vedeți un
#!/bin/bash no such file or directory
mesaj de eroare, întrucât nu există ‘ motiv pentru care nimic ar încerca să execute sau să deschidă#!/bin/bash
. ‘ este/bin/bash<CR>
ceea ce ar fi executat. - @StephaneChazelas Pe măsură ce dos2unix a rezolvat problema, există puține îndoieli nu a fost ‘ o problemă CRLF. Mesajul de eroare a fost probabil doar transcris inexact ..
-
dos2unix
elimină, de asemenea, un BOM UTF-8. Un BOM UTF-8 ar fi putut explica mesajul de eroare. - Este trist cât de incompatibil este Microsoft. Chiar și cu ceva la fel de simplu ca ASCII.
Răspuns
Acest lucru poate fi cauzat și de o listă de materiale într-un UTF -8 script. Dacă creați scriptul în Windows, uneori obțineți ceva nedorit la începutul fișierului.
Comentarii
- Nomenclatorul poate fi eliminat cu ușurință folosind awk, ca în stackoverflow.com/questions/1068650/…
- Rețineți că Visual Studio pentru Mac va insera o listă de materii prime.
Răspuns
De fapt, shebang-ul potrivit pentru scriptul bash este acesta:
#!/usr/bin/env bash
Deoarece, în freeBSD, bash se află în /usr/local/bin/bash
Comentarii
- ” dreapta ” este un cuvânt dificil de utilizat în astfel de cazuri. Poate că o frază mai bună ar fi ” mai puțin predispusă la erori „.
- Și asta este cumplit; presupunerea că / usr există este una proastă IMO. Haiku, de exemplu, nu are / usr.
Răspuns
Puteți utiliza vi pentru a remedia ambele probleme dacă există:
vi <your_file> :set ff=unix :set nobomb :wq
Comentarii
- Răspunsurile ar trebui să fie autonome cât mai mult posibil. Întrebarea nu menționează două probleme; dacă aveți de gând să construiți pe alte răspunsuri, ar trebui cel puțin să spuneți care sunt acestea. Mai bine, ar trebui să explicați cum răspunde la întrebare.
- Remediere foarte rapidă fără descărcarea mai multor instrumente Windows, mulțumesc!
- @ G-Man Alte răspunsuri menționează deja acest lucru în detalii mult mai bune decât aș vrea să intru.Nu este nevoie să repetați, dar dacă ‘ nu este dureros de evident, puteți avea un sfârșit de linie Windows și un caracter Windows BOM ascuns. Cred că o mulțime de oameni care scanează răspunsuri apreciază concizia în loc să fie auto-conținute, mai ales atunci când există mult mai multe detalii în alte răspunsuri.
Răspuns
Dacă nu aveți dos2unix, acesta este un mod de a remedia această problemă.
cp script _p4 && tr -d "\r" < _p4 > script && rm _p4
Răspundeți
Marcă de ordin de octet (BOM)
Acest lucru ar putea fi cauzat de un BOM. Din Wikipedia, un BOM este un
Marca de ordine a octetului (BOM) este un caracter Unicode, U + FEFF marca de ordine a octetului (BOM) , a cărui apariție ca număr magic la începutul unui flux de text poate semnala mai multe lucruri unui program care consumă textul
Din păcate, nu semnalează nimic kernel-ului Linux care gestionează linia she-bang. Puteți verifica dacă aveți o listă de material utilizând file
,
file /tmp/foo /tmp/foo: UTF-8 Unicode (with BOM) text
Sau puteți descărca în mod hexagonal primele câteva caractere și vedeți dacă se potrivesc manual cu oricare dintre caracterele BOM
Puteți dezbrăca caracterele BOM după ce le cunoașteți astfel ,
sed -i "1 s/^\xef\xbb\xbf//" *.txt
Răspuns
Am avut problema adăugând accidental un bash greșit executabil pentru PATH
și pentru că în scriptul meu a fost folosit #!/usr/bin/env bash
shebang mai flexibil (luați primul executabil bash din cale).
command -v bash /cygdrive/c/Program Files/Git/bin//bash
Am instalat GIT pentru Windows pentru a funcționa în cygwin
împreună cu GUI Windows GIT (nu funcționa cu git nativ cygwin …). Am rezolvat acest lucru trecând la #!/bin/bash
sheband și eliminând GIT pentru Windows din PATH
.
Răspuns
Încercați #!/bin/bash
Al doilea lucru: find / -name bash
Al treilea lucru: ls -al /bin/bash
Comentarii
- Sau doar
which bash
. Știm că ‘ găsește unul deoarece ‘ funcționează cubash script.sh
. - Adevărat. Și, așa cum am menționat, există metoda mult mai portabilă / usr / bin / env pentru ca un program să localizeze bash (sau un alt interpret) pentru dvs. Nu este nevoie să codificați hard pah.