#! / bin / bash – niet zon bestand of directory

Ik heb een bash-script gemaakt, maar als ik het probeer uit te voeren, krijg ik

#!/bin/bash no such file or directory 

Ik moet het commando: bash script.sh uitvoeren om het te laten werken.

Hoe kan ik dit oplossen?

Reacties

  • Ik heb dit probleem nu onder cygwin met een script waarvan ik zou kunnen zweren dat het al zonder problemen draaide. Ik heb alle antwoorden gecontroleerd, maar geen enkele lijkt te passen. Andere vragen en antwoorden noemden ook 32/64-bits problemen, maar voor shell-scripts kon dit worden uitgesloten, toch?
  • De reden gevonden, details toegevoegd in nieuw antwoord unix.stackexchange.com/a/450389/62636 voor het geval iemand ook #!/usr/bin/env bash heeft gebruikt in plaats van #!/bin/bash en ook hier aan het kijken …

Antwoord

Dit soort bericht is meestal te wijten aan een nep-shebang-lijn, ofwel een extra wagenretour aan het einde van de spar st regel of een stuklijst aan het begin ervan.

Voer:

$ head -1 yourscript | od -c 

uit en kijk hoe het eindigt.

Dit is fout:

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

Dit is ook fout:

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

Dit is correct:

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

Gebruik dos2unix (of sed, tr, awk, perl, python…) om uw script te repareren als dit het probleem is.

Hier is er een die zowel een stuklijst als een tailing CRs verwijdert:

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


Merk op dat de shell die u gebruikt om het script uit te voeren een kleine invloed zal hebben op de foutmeldingen die worden weergegeven.

Hier zijn drie scripts die alleen hun naam tonen (echo $0) en met de volgende respectieve shebang-regels:

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 

Als je ze uitvoert, worden deze berichten weergegeven:

$ ./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 

De bo Door expliciet de interpreter aan te roepen, kan het CRLF-script probleemloos worden uitgevoerd:

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

Hier is het gedrag dat wordt waargenomen onder ksh:

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

en onder dash:

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

Reacties

  • Een andere manier om te onthullen of dit het probleem is, is hexdump -C yourscript | head -n 1. Ik zou nog steeds dos2unix yourscript gebruiken om het probleem op te lossen.
  • Als het een CRLF-probleem was, zou je ‘ niet zien een #!/bin/bash no such file or directory foutmelding, aangezien er ‘ geen reden is om iets uit te voeren of te openen #!/bin/bash. Het ‘ s /bin/bash<CR> wat er zou worden uitgevoerd.
  • @StephaneChazelas Aangezien dos2unix het probleem heeft opgelost, is er weinig twijfel over het was geen ‘ een CRLF-probleem. De foutmelding is waarschijnlijk onjuist getranscribeerd.
  • dos2unix verwijdert ook een UTF-8 BOM. Een UTF-8 BOM had de foutmelding kunnen verklaren.
  • Het is triest hoe incompatibel Microsoft is. Zelfs met iets basaals als ASCII.

Antwoord

Dit kan ook worden veroorzaakt door een stuklijst in een UTF -8 script. Als u het script in Windows maakt, krijgt u soms wat rommel aan het begin van het bestand.

Opmerkingen

Answer

Eigenlijk is de juiste shebang voor bash-script deze:

#!/usr/bin/env bash 

Omdat bash zich in freeBSD bevindt in /usr/local/bin/bash

Reacties

  • ” right ” is in zulke gevallen een moeilijk woord om te gebruiken. Misschien is een betere zin ” minder foutgevoelig “.
  • Dit is ook verschrikkelijk; de aanname dat / usr bestaat is een slechte IMO. Haiku heeft bijvoorbeeld geen / usr.

Answer

Je kunt vi gebruiken om beide problemen op te lossen als ze bestaan:

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

Reacties

  • Antwoorden moeten zoveel mogelijk op zichzelf staan. De vraag noemt geen twee problemen; als je voortbouwt op andere antwoorden, moet je tenminste zeggen wat ze zijn. Beter nog, je zou moeten uitleggen hoe dit de vraag beantwoordt.
  • Zeer snelle oplossing zonder meer Windows-tools te downloaden, bedankt!
  • @ G-Man Andere antwoorden noem dit al veel beter in detail dan ik erop wil ingaan.Het is niet nodig om te herhalen, maar als het ‘ niet pijnlijk duidelijk is, kun je een WIndows-regeluitgang hebben en een verborgen Windows BOM-teken. Ik denk dat veel mensen die antwoorden scannen, beknoptheid waarderen in plaats van op zichzelf staand te zijn, vooral wanneer er veel meer details in andere antwoorden zijn.

Antwoord

Als u geen dos2unix heeft, is dit een manier om dit probleem op te lossen.

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

Antwoord

Byte-order Mark (BOM)

Dit kan worden veroorzaakt door een stuklijst. Van Wikipedia is een stuklijst een

Het bytevolgordemarkering (BOM) is een Unicode-teken, U + FEFF bytevolgordemarkering (BOM) , waarvan het uiterlijk als een magisch getal aan het begin van een tekststroom verschillende dingen kan aangeven voor een programma dat de tekst verbruikt

Helaas, het signaleert niets aan de Linux-kernel die de she-bang-regel afhandelt. Je kunt verifiëren dat je een stuklijst hebt door file te gebruiken ,

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

Of u kunt hexdump de eerste paar tekens en zie als ze handmatig overeenkomen met een van de stuklijsttekens

U kunt de stuklijsttekens verwijderen zodra u ze op deze manier kent ,

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

Answer

Ik had het probleem door per ongeluk een verkeerde bash toe te voegen uitvoerbaar naar de PATH en omdat in mijn script de meer flexibele #!/usr/bin/env bash shebang werd gebruikt (neem het eerste bash-uitvoerbare bestand van het pad).

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

Ik heb GIT voor Windows geïnstalleerd om te werken in cygwin samen met Windows GIT GUIs (werkte niet met cygwin native git …). Ik heb dit nu opgelost door over te schakelen naar #!/bin/bash sheband en GIT for windows te verwijderen van PATH.

Antwoord

Probeer #!/bin/bash

Tweede ding: find / -name bash
Ten derde: ls -al /bin/bash

Reacties

  • Of gewoon which bash. We weten dat ‘ er een vindt omdat het ‘ werkt met bash script.sh.
  • Waar. En zoals vermeld, is er de veel meer draagbare / usr / bin / env-methode om een programma bash (of een andere interpreter) voor je te laten lokaliseren. Het is niet nodig om een pah te coderen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *