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
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 steedsdos2unix 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
- BOM kan eenvoudig worden verwijderd met awk, zoals in stackoverflow.com/questions/1068650/…
- Merk op dat Visual Studio voor Mac zal een stuklijst invoegen.
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 metbash 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.
#!/usr/bin/env bash
heeft gebruikt in plaats van#!/bin/bash
en ook hier aan het kijken …