dos2unix
commande, 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 » ?
Obtention d’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 à la ligne suivante. Windows descendant sous DOS aime voir un terminateur « retour chariot et saut de ligne » (CRLF), noté rn
. 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 les voit rn
fins de ligne 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 le file
commande à votre script.
file 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 qui portent bien leur nom. dos2unix
. Il est disponible dans la plupart des référentiels par défaut, vous pouvez donc l’installer sur Ubuntu avec :
sudo apt install dos2unix
Sur notre installation Fedora dos2unix
est venu préinstallé, mais vous pouvez confirmer que vous l’avez avec:
sudo dnf install dos2unix
Sur Arch Linux :
sudo pacman -S dos2unix
En utilisant 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.
dos2unix script*.sh
Le dos2unix
La commande 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 à l’envers, unix2dos
, si vous souhaitez revenir à CRLF. Entrer dos2unix --help
pour apprendre 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 le tr
commande, vous pouvez supprimer la r
une partie des fins de ligne donc il nous reste n
terminateurs.
tr -d 'r' < script1.sh > script1_unix.sh
Ici, tr
prend le texte de la script1.sh
fichier, en supprimant chaque instance de r
il trouve et enregistre la sortie en tant que fichier script1_unix.sh
.
Utilisation de la commande sed
Le puissant sed
La commande 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 sed
syntaxe, nous disons sed
pour éditer notre fichier (-i
) et remplacer (s/
) chaque retour chariot (r
) avec rien. Cela nous laisse avec la préférence d’Unix n
terminaisons de ligne.
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 fileformat=unix
EN RAPPORT: 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 ».
EN RAPPORT: Comment rendre vos scripts Bash compatibles avec le matériel