Correction : erreur "Mauvais interprète : aucun fichier ou répertoire de ce type" sous Linux
Publié: 2023-05-01dos2unix
, comme ceci :dos2unix script1.sh
Avez-vous essayé d'exécuter un script Bash et avez-vous reçu le message d'erreur « /bin/bash^M : mauvais interprète : aucun fichier ou répertoire de ce type » ? La sortie n'est pas très utile et donne presque l'impression que votre script est manquant. Heureusement, ce n'est pas le cas, et la solution est très simple.
Qu'est-ce que l'erreur "Mauvais interprète : aucun fichier ou répertoire de ce type" ?
Comment réparer une erreur "Mauvais interprète : aucun fichier ou répertoire de ce type"
Utilisation de la commande dos2unix
Utilisation de la commande tr
Utilisation de la commande sed
Utiliser vi ou vim
Utilisation de Geany
Utiliser Kate ou Kwrite
Utilisation du Bloc-notes++
Utilisation du code VS
Qu'est-ce que l'erreur "Mauvais interprète : aucun fichier ou répertoire de ce type" ?
Obtenir un message d'erreur indiquant /bin/bash^M: bad interpreter: No such file or directory
signifie simplement que votre fichier de script shell a les mauvaises fins de ligne - les caractères placés à la fin d'une ligne indiquant qu'il est temps de passer au ligne suivante. Windows descendu sous DOS aime voir un terminateur "retour chariot et saut de ligne" (CRLF), noté \r\n
. En revanche, Linux, macOS moderne et d'autres systèmes basés sur Unix utilisent uniquement le "saut de ligne" (LF) ou \n
.
Si vous voyez cette erreur de mauvais interpréteur, il y a de fortes chances que vous ou la personne à qui vous avez fourni le script l'ait initialement écrit sur un ordinateur Windows. Bash voit ces fins de ligne \r\n
définies par l'ordinateur Windows et s'énerve car elles empêchent le shell d'interpréter correctement votre script.
Vous pouvez même confirmer le problème dans un terminal Linux en pointant la commande file
vers votre script.
fichier script1.sh
Si le fichier utilise des fins de ligne DOS, vous verrez le message "avec des terminaisons de ligne CRLF" ajouté dans la sortie. Si notre script avait utilisé les nouvelles lignes Unix (LF) appropriées, il ne mentionnerait pas du tout les terminateurs. Heureusement, il est facile de se remettre dans les affaires de la FL.
Comment réparer une erreur "Mauvais interprète : aucun fichier ou répertoire de ce type"
Tout ce qu'il faut pour se débarrasser de ce message d'erreur et commencer à exécuter vos scripts normalement est de passer des fins de ligne DOS aux fins de ligne Unix. Vous pouvez le faire avec les commandes du terminal ou dans votre éditeur de code préféré. Voici huit façons de le réparer :
Utilisation de la commande dos2unix
Il existe un programme en ligne de commande conçu uniquement pour convertir des fichiers DOS (alias Windows) en fichiers entièrement compatibles Unix, nommés à juste titre dos2unix
. Il est disponible dans la plupart des référentiels par défaut, vous pouvez donc l'installer sur Ubuntu avec :
sudo apt installer dos2unix
Sur notre installation Fedora, dos2unix
était préinstallé, mais vous pouvez confirmer que vous l'avez avec :
sudo dnf installer dos2unix
Sur Arch Linux :
sudo pacman -S dos2unix
L'utilisation dos2unix
est simple ; Donnez-lui simplement votre nom de fichier.
dos2unix script1.sh
Vérifiez-le avec file
si vous souhaitez confirmer que la conversion a réussi avant d'exécuter votre script. Vous pouvez également effectuer une conversion en masse en nommant plusieurs fichiers séparés par un espace uniquement.
dos2unix script1.sh script2.sh script3.sh
Ou, si vous avez des noms de fichiers cohérents, vous pouvez bien sûr écrire des commandes plus courtes en utilisant des caractères génériques.
script dos2unix*.sh
La commande dos2unix
a plusieurs drapeaux pour vous aider à faire des types spéciaux de conversions, comme changer la propriété du fichier. Vous pouvez même l'utiliser sous forme inversée, unix2dos
, si vous souhaitez revenir à CRLF. Entrez dos2unix --help
pour en savoir plus.
Utilisation de la commande tr
Si vous ne pouvez pas ou ne voulez pas installer un utilitaire dédié, Linux dispose d'outils intégrés qui nettoieront ces nouvelles lignes. Avec la commande tr
, vous pouvez supprimer la partie \r
des fins de ligne afin qu'il nous reste des terminateurs \n
.
tr -d '\r' < script1.sh > script1_unix.sh
Ici, tr
prend le texte du fichier script1.sh
, supprime toutes les instances de \r
qu'il trouve et enregistre la sortie dans le fichier script1_unix.sh
.
Utilisation de la commande sed
La puissante commande sed
intégrée à votre shell peut également modifier les fins de ligne de votre fichier.
sed -i 's/\r//' script1.sh
Si vous n'êtes pas familier avec la syntaxe sed
, nous disons à sed
de modifier notre fichier ( -i
) et de remplacer ( s/
) chaque retour chariot ( \r
) par rien. Cela nous laisse avec les terminateurs de ligne \n
préférés d'Unix.
Utiliser vi ou vim
Si vous utilisez vi ou vim pour éditer vos scripts, passez simplement cette commande pour convertir le fichier actuellement ouvert en fins de ligne Unix.
:set format_fichier=unix
CONNEXION: Comment quitter l'éditeur Vi ou Vim
Utilisation de Geany
Si vous travaillez dans un environnement de bureau, il n'y a aucune raison de s'amuser dans le terminal juste pour préparer vos fichiers pour le monde Unix. Pratiquement tous les éditeurs de code et IDE ont une bascule pour les fins de ligne. Cela inclut Geany.
Pour convertir les fins de ligne dans Geany, accédez à Document> Définir les fins de ligne> Convertir et définir en LF (Unix).
Enregistrez votre script et essayez de l'exécuter à nouveau.
Utiliser Kate ou Kwrite
Si vous utilisez Kwrite pour éditer votre script, ou Kate, la cousine plus puissante de Kwrite, vous pouvez convertir au format LF en cliquant sur Outils > Fin de ligne > Unix.
Enregistrez le fichier et exécutez à nouveau votre script.
Utilisation du Bloc-notes++
Si vous modifiez du code dans Notepad++, vous pouvez également convertir facilement les fins de ligne, ce qui est pratique car vous l'exécutez probablement sous Windows (sauf si vous avez installé Notepad++ pour Linux) et pouvez les convertir avant de passer à votre système Linux. Avec le fichier ouvert, allez dans Edition > Conversion EOL > Unix (LF).
Assurez-vous de sauvegarder votre script avant de l'exécuter.
Si vous souhaitez que Notepad ++ crée des fichiers avec des fins de ligne Unix par défaut, accédez à Paramètres> Préférences, sélectionnez l'onglet "Nouveau document" et sous les options "Format (fin de ligne)", cliquez sur le bouton radio "Unix (LF)".
Utilisation du code VS
Visual Studio Code (VS Code) fonctionne à peu près de la même manière, seule la bascule est encore plus facile à trouver. Cliquez simplement sur "CRLF" dans le coin inférieur droit de la fenêtre de VS Code.
Vous pouvez également configurer VS Code pour qu'il utilise les fins de ligne Unix par défaut en accédant à Fichier> Préférences> Paramètres et en tapant eol
dans la barre de recherche des paramètres. Le résultat supérieur devrait être un menu déroulant pour définir le "Eol". Changez-le en "\n".
CONNEXION: Comment rendre vos scripts Bash compatibles avec le matériel