Merci @jdt pour votre réponse.
Suite à cela, et comme je continue d'avoir ce problème avec le retour chariot, j'ai écrit ce petit script. N'exécutez que carriage_return
et vous serez invité à "nettoyer" le fichier.
https://gist.github.com/kartonnade/44e9842ed15cf21a3700
alias carriage_return=remove_carriage_return
remove_carriage_return(){
# cygwin throws error like :
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile
read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'
# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean
# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean
eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file
eval 'rm '$temp_file_to_clean
}
Il peut s'agir d'un problème d'encodage de fichier.
J'ai rencontré des problèmes d'encodage de type de fichier lorsque je travaillais sur des fichiers entre différents systèmes d'exploitation et éditeurs - dans mon cas, en particulier entre les systèmes Linux et Windows.
Je suggère de vérifier l'encodage de votre fichier pour vous assurer qu'il convient à l'environnement Linux cible. Je suppose qu'un problème d'encodage est moins probable étant donné que vous utilisez un MAC que si vous aviez utilisé un éditeur de texte Windows, mais je pense que l'encodage de fichier vaut toujours la peine d'être pris en compte.
--- EDIT (Ajouter une solution réelle comme recommandé par @Potatoswatter)
Pour démontrer comment l'encodage du type de fichier pourrait être ce problème, j'ai copié/collé votre exemple de script dans le Bloc-notes sous Windows (je n'ai pas accès à un Mac), puis l'ai copié sur une machine Linux et l'ai exécuté :
[email protected]:~/windows> sh ./originalfile
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {
Dans ce cas, le Bloc-notes a enregistré le fichier avec des retours chariot et des sauts de ligne, provoquant l'erreur ci-dessus. Le \r
indique un retour chariot (les systèmes Linux terminent les lignes avec des sauts de ligne \n
seulement).
Sur la machine Linux, vous pouvez tester cette théorie en exécutant ce qui suit pour supprimer les retours chariot du fichier, s'ils sont présents :
cat originalfile | tr -d "\r" > newfile
Essayez ensuite d'exécuter le nouveau fichier sh ./newfile
. Si cela fonctionne, le problème était les retours chariot en tant que caractères masqués.
Remarque : Ce n'est pas une réplique exacte de votre environnement (je n'ai pas accès à un Mac), mais il me semble probable que le problème est qu'un éditeur, quelque part, a enregistré des retours chariot dans le fichier.
--- /MODIFIER
Pour détailler un peu, les systèmes d'exploitation et les éditeurs peuvent avoir des valeurs par défaut d'encodage de fichiers différentes. En règle générale, les applications et les éditeurs influenceront l'encodage du type de fichier utilisé, par exemple, je pense que Microsoft Notepad et Notepad ++ sont par défaut Windows-1252. Il peut également y avoir des différences de saut de ligne à prendre en compte (dans les environnements Windows, un retour chariot et un saut de ligne sont souvent utilisés pour terminer les lignes dans les fichiers, tandis que sous Linux et OSX, seul un saut de ligne est généralement utilisé).
Une question et une réponse similaires qui font référence à l'encodage de fichier sont ici :mauvais caractère apparaissant dans l'exécution du script bash
essayez quelque chose comme
$ sudo apt-get install dos2unix
$ dos2unix offendingfile
Un moyen facile de convertir example.sh
fichier à UNIX
si vous travaillez sous Windows est d'utiliser NotePad++ (Edition>Conversion EOL>Format UNIX/OSX)
Vous pouvez également définir l'EOL par défaut dans le bloc-notes ++ (Paramètres> Préférences> Nouveau document/Répertoire par défaut> sélectionnez Unix / OSX dans la zone Format)