
dos2unix commando, zoals dit:
dos2unix-script1.sh
Heb je geprobeerd een Bash-script uit te voeren en kreeg je de foutmelding “/bin/bash^M: bad interpreter: No such file or directory”? De uitvoer is niet erg nuttig en wekt bijna de indruk dat uw script ontbreekt. Gelukkig is dat niet het geval en is de oplossing heel eenvoudig.
Wat is de fout “Slechte tolk: geen bestand of map”?
Een fout “Slechte tolk: geen dergelijk bestand of map” oplossen
Het dos2unix-commando gebruiken
Het tr-commando gebruiken
Het sed-commando gebruiken
Vi of vim gebruiken
Geany gebruiken
Kate of Kwrite gebruiken
Kladblok++ gebruiken
VS-code gebruiken
Wat is de fout “Slechte tolk: geen bestand of map”?
Krijg een foutmelding die leest /bin/bash^M: bad interpreter: No such file or directory betekent alleen dat uw shell-scriptbestand de verkeerde regeleinden heeft – de tekens aan het einde van een regel geven aan dat het tijd is om naar de volgende regel te gaan. DOS-afkomstige Windows ziet graag een “carriage return and line feed” (CRLF) terminator, genoteerd rn. Linux, moderne macOS en andere op Unix gebaseerde systemen gebruiken daarentegen alleen “line feed” (LF), of n.
Als je deze slechte tolkfout ziet, is de kans groot dat jij of de persoon van wie je het script hebt gekregen het oorspronkelijk op een Windows-computer heeft geschreven. Bash ziet die rn regeleindes ingesteld door de Windows-computer en raakt van streek omdat ze voorkomen dat de shell uw script correct interpreteert.

U kunt het probleem zelfs in een Linux-terminal bevestigen door naar de file opdracht aan uw script.
file script1.sh

Als het bestand DOS-regeleinden gebruikt, ziet u het bericht “met CRLF-regeleinden” in de uitvoer. Als ons script de juiste Unix (LF) nieuwe regels had gebruikt, zou het helemaal geen terminators vermelden. Gelukkig is het gemakkelijk om weer in LF-zaken te komen.
Een “Slechte tolk: geen bestand of map”-fout oplossen
Het enige dat nodig is om van die foutmelding af te komen en uw scripts normaal uit te voeren, is overschakelen van DOS-regeleinden naar Unix-regeleinden. U kunt dit doen met terminalopdrachten of in uw favoriete code-editor. Hier zijn acht manieren om het te repareren:
Het dos2unix-commando gebruiken
Er is een opdrachtregelprogramma dat speciaal is gemaakt voor het converteren van DOS-bestanden (ook bekend als Windows) naar volledig Unix-compatibele bestanden met de toepasselijke naam dos2unix. Het is beschikbaar in de meeste standaardrepository’s, dus je kunt het op Ubuntu installeren met:
sudo apt install dos2unix
Op onze Fedora-installatie dos2unix kwam voorgeïnstalleerd, maar u kunt bevestigen dat u het heeft met:
sudo dnf install dos2unix
Op ArchLinux:
sudo pacman -S dos2unix
Gebruik makend van dos2unix is simpel; geef het gewoon je bestandsnaam.
dos2unix script1.sh

Controleer het met file als u wilt bevestigen dat de conversie is geslaagd voordat u uw script uitvoert. U kunt ook massaal converteren door meerdere bestanden een naam te geven, gescheiden door alleen een spatie.
dos2unix script1.sh script2.sh script3.sh
Of, als je een consistente bestandsnaam hebt, kun je natuurlijk kortere commando’s schrijven met behulp van jokertekens.
dos2unix script*.sh

De dos2unix commando heeft verschillende vlaggen om u te helpen speciale soorten conversies uit te voeren, zoals het wijzigen van het eigendom van bestanden. Je kunt het zelfs in omgekeerde vorm gebruiken, unix2dos, als u terug wilt schakelen naar CRLF. Binnenkomen dos2unix --help meer leren.
Het tr-commando gebruiken
Als je geen speciaal hulpprogramma kunt of wilt installeren, heeft Linux ingebouwde tools die die nieuwe regels opschonen. Met de tr opdracht, kunt u de r een deel van de regel eindigt dus we houden over n terminators.
tr -d 'r' < script1.sh > script1_unix.sh
Hier, tr neemt de tekst van de script1.sh bestand, waarbij elk exemplaar van wordt verwijderd r het vindt en slaat de uitvoer op als het bestand script1_unix.sh.
Het sed-commando gebruiken
De machtige sed commando dat in uw shell is ingebouwd, kan ook regeleinden voor uw bestand wijzigen.
sed -i 's/r//' script1.sh
Mocht je er niet bekend mee zijn sed syntaxis, zeggen we sed om ons bestand te bewerken (-i) en vervangen (s/) elke regelterugloop (r) met niets. Dat laat ons achter met de voorkeur van Unix n lijn terminators.
Vi of vim gebruiken
Als u vi of vim gebruikt om uw scripts te bewerken, geeft u gewoon deze opdracht door om het momenteel geopende bestand te converteren naar Unix-regeleinden.
:set fileformat=unix

Geany gebruiken
Als je in een desktopomgeving werkt, is er geen reden om in de terminal te rotzooien om je bestanden klaar te maken voor de Unix-wereld. Vrijwel elke code-editor en IDE die er is, heeft een schakelaar voor regeleindes. Dat geldt ook voor Geany.
Om regeleinden in Geany te converteren, gaat u naar Document > Regeleinden instellen > Converteren en instellen op LF (Unix).

Sla uw script op en probeer het opnieuw uit te voeren.
Kate of Kwrite gebruiken
Als u Kwrite gebruikt om uw script te bewerken, of Kwrite’s krachtigere neef Kate, kunt u converteren naar LF-formaat door te klikken op Extra > Einde regel > Unix.

Sla het bestand op en voer uw script opnieuw uit.
Kladblok++ gebruiken
Als je code bewerkt in Notepad++, kun je ook gemakkelijk regeleinden converteren, wat handig is omdat je het waarschijnlijk op Windows draait (tenzij je Notepad++ voor Linux hebt geïnstalleerd) en ze kunt converteren voordat je naar je Linux-systeem gaat. Open het bestand en ga naar Bewerken > EOL-conversie > Unix (LF).

Zorg ervoor dat u uw script opslaat voordat u het uitvoert.
Als u wilt dat Notepad++ standaard bestanden met Unix-regeleinden maakt, gaat u naar Instellingen > Voorkeuren, selecteert u het tabblad “Nieuw document” en klikt u onder de opties “Opmaak (regeleinde)” op het keuzerondje “Unix (LF)”.

VS-code gebruiken
Visual Studio Code (VS Code) werkt op vrijwel dezelfde manier, alleen is de schakelaar nog gemakkelijker te vinden. Klik gewoon op “CRLF” in de rechterbenedenhoek van het VS Code-venster.

U kunt VS Code ook instellen om standaard Unix-regeleinden te gebruiken door naar Bestand > Voorkeuren > Instellingen te gaan en te typen eol in de instellingenzoekbalk. Het bovenste resultaat zou een vervolgkeuzemenu moeten zijn voor het instellen van de “Eol”. Verander het in “n”.
