#! / bin / bash – nu există un astfel de fișier sau director

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 continuare dos2unix 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

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ă cu bash 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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *