-bash: ./my_script: / bin / bash ^ M: interpréteur incorrect: aucun fichier ou répertoire de ce type

J’apprends à travers ce tutoriel pour apprendre les scripts bash pour automatiser quelques tâches pour moi. Je me connecte à un serveur en utilisant du mastic.

Le script, situé dans .../Documents/LOG , est:

 #!/bin/bash # My first script echo "Hello World!" 

Et j’ai exécuté ce qui suit pour les permissions de lecture / écriture / exécution

 chmod 755 my_script 

Ensuite, quand j’entre ./my_script , je reçois l’erreur indiquée dans le titre.

Certaines questions similaires souhaitaient les voir, alors je pense qu’elles pourraient aider:

 which bash 

/ bin / bash

et

 echo $PATH 

/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / bin / mh

J’ai essayé d’append le répertoire actuel à PATH , mais cela ne fonctionne pas.

J’ai constaté ce problème lors de la création de scripts dans Windows env, puis lors du transfert sur un environnement Unix.

Essayez de lancer ceci sur le script:

http://linuxcommand.org/man_pages/dos2unix1.html

Lien mis à jour:

http://dos2unix.sourceforge.net/

Ou réécrivez simplement le script dans votre env Unix en utilisant vi et test.

Unix utilise différents sauts de ligne et les retours chariot ne peuvent donc pas lire le fichier que vous avez créé sous Windows. Par conséquent, il considère ^ M comme un caractère illégal.

Si vous souhaitez écrire un fichier sous Windows, puis le transférer, assurez-vous que votre éditeur est configuré pour créer des fichiers au format UNIX.

Dans notepad ++ en bas à droite de l’écran, il vous indique le format du document. Par défaut, il sera dit Dos\Windows . Pour le changer allez à

  • parameters-> préférences
  • nouvel onglet de document / répertoire par défaut
  • sélectionnez le format comme unix et fermez
  • créer un nouveau document

Exécuter la commande suivante dans le terminal

 sed -i -e 's/\r$//' scriptname.sh 

Alors essaye

 ./scriptname.sh 

Ça devrait marcher.

Si vous utilisez Sublime Text sous Windows ou Mac pour éditer vos scripts:

Cliquez sur View > Line Endings > Unix et enregistrez à nouveau le fichier.

entrer la description de l'image ici

Cela est dû à la modification du fichier dans Windows et à l’importation et à l’exécution sous Unix.

dos2unix -k -o filename devrait faire l’affaire.

Dans notepad ++, vous pouvez le définir spécifiquement pour le fichier en appuyant sur

Edit -> Conversion EOL -> Format UNIX / OSX

entrer la description de l'image ici

le problème est avec la fin de la ligne dos. La suite le convertira pour unix

 dos2unix file_name 

NB: vous devrez peut-être d’abord installer dos2unix avec yum install dos2unix

une autre façon de le faire est d’utiliser la commande sed pour rechercher et remplacer les caractères de fin de ligne dos au format unix:

 $sed -i -e 's/\r$//' your_script.sh 

Votre fichier a des fins de ligne Windows, ce qui est source de confusion pour Linux.

Supprimez les caractères CR erronés. Vous pouvez le faire avec la commande suivante:

  $ sed -i -e 's/\r$//' setup.sh 

Pour les utilisateurs d’ Eclipse , vous pouvez modifier le codage du fichier directement à partir du menu File > Convert Line Delimiters To > Unix (LF, \n, 0Α, ¶) :

Eclipse change le codage du fichier

Ou changez le New text file line delimiter en Other: Unix sur Window > Preferences > General > Workspace Panneau Window > Preferences > General > Workspace :

Paramètres de l'espace de travail Eclipse

J’ai pu résoudre le problème en ouvrant le script dans Gedit et en l’enregistrant avec l’option de Line Ending appropriée:

Fichier> Enregistrer sous …

En bas à gauche de l’invite Save As , il y a des menus déroulants pour Codage de caractères et Fin de ligne. Changez la fin de ligne de Windows en Unix/Linux puis enregistrez.

Gedit

Atom a un package de sélecteur de fin de ligne intégré

Plus de détails ici: https://github.com/atom/line-ending-selector

Je développe sous Windows et Mac / Linux en même temps et j’évite cette erreur en exécutant simplement mes scripts comme je le fais dans Windows:

$ php ./my_script

Pas besoin de changer les fins de ligne.