384 votes

Cygwin - ' \r ' : commande non trouvée - .bashrc / .bash_profile

J'ai Windows, qui utilise Cgywin, et j'essaie de définir JAVA_HOME de façon permanente par le biais de mon système d'exploitation. .bashrc fichier.

.bashrc :

export PATH="$JAVA_HOME/bin:$PATH"  
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"

.bash_profile :

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

en exécutant cygwin :

-bash: $'\377\376if': command not found
-bash: $'then\r': command not found
: No such file or directorysu//.bashrc
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi'
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi'

Je ne sais pas si j'ai repris les commandes d'un tutoriel destiné à un autre système ou si je manque une étape. Ou bien les espaces blancs font que mes commandes ne s'exécutent pas correctement.

J'ai examiné de nombreuses questions similaires, mais je n'en ai pas trouvé une où la question correspondait exactement à mon erreur.

Merci

EDIT #1 :

mon chemin de retour

$ echo $HOME
/cygdrive/c/Users/jhsu

Je pense donc que les fichiers devraient être placés au bon endroit.

EDIT #2 :

echo ~

$ echo ~
/cygdrive/c/Users/jhsu/

0 votes

Qu'est-ce que echo ~ donner ?

0 votes

$ echo ~ /cygdrive/c/Users/jhsu/

8 votes

Le problème n'est pas spécifique à cygwin -- le même problème peut se produire si l'on crée un script sur une machine DOS et que l'on effectue un transfert binaire vers un système Linux pour l'y exécuter ; j'ai retiré la référence à cygwin du titre afin que les personnes ayant ce problème dans d'autres circonstances soient plus susceptibles de prendre la question (et ses réponses non spécifiques à Cygwin) au sérieux.

30voto

Si vous utilisez une version récente de Cygwin (par exemple 1.7), vous pouvez également lancer les deux applications suivantes .bashrc et .bash_profile avec la ligne suivante, sur la première ligne non commentée :

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is needed

Cela forcera bash à ignorer le retour chariot ( \r ) utilisés dans les séparateurs de ligne de Windows.

Voir http://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html .

0 votes

C'est ce que je cherchais mais cela n'a pas marché pour moi cela devrait-il encore fonctionner maintenant, un an plus tard ?

0 votes

Éditer : export SHELLOPTS a fait l'affaire pour moi ! mais de temps en temps j'ai toujours le message "invalid option name" - pourquoi ?

0 votes

29voto

kenorb Points 2464

L'erreur :

'\r' : commande non trouvée

est causé par le fait que le shell n'est pas capable de reconnaître les fins de ligne CRLF de type Windows ( 0d 0a ) car il ne s'attend qu'à LF ( 0a ).


Git

Si vous utilisez Git sous Windows, assurez-vous que vous avez sélectionné ' Départ en l'état pendant l'installation. Ensuite, assurez-vous que vous exécutez : git config --global core.autocrlf false Git n'effectuera donc aucune conversion lors de l'extraction ou de la validation des fichiers texte.


dos2unix

Si vous n'utilisez pas Git, vous devez simplement reconvertir ces fichiers/scripts affectés en terminaisons de ligne (LF) de type Unix, soit par :

dos2unix ~/.bashrc

Note : Le dos2unix fait partie de dos2unix paquet.

Éditeur Ex/Vim + tr

Si vous avez installé Vim, la commande suivante devrait corriger les fichiers :

ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*

Alias utiles : alias dos2unix="ex +'bufdo! %! tr -d \\\\r' -scxa" .

tr

Voici la méthode en utilisant tr :

cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc

ou :

tr -d '\r' < filename > new_filename

Note : Le \r est équivalent à \015 .


sed

Vous pouvez essayer la commande suivante :

sed -i'.bak' s/\r//g ~/.bash*

recode

Les alias suivants peuvent être utiles (qui remplacent dos2unix commande) :

alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'

Source : Outils Unix gratuits (ssh, bash, etc) sous Windows .


perl

Les éléments suivants perl permet de convertir le fichier du DOS au format Unix :

perl -p -i.bak -e 's/\015//g' ~/.bash*

Source : dépouiller le ^M .


tofrodos

Sur Linux, comme Ubuntu qui n'est pas livré en standard avec l'un ou l'autre dos2unix o unix2dos vous pouvez installer tofrodos paquet ( sudo apt-get install tofrodos ), et définissez les alias suivants :

alias dos2unix=’fromdos’
alias unix2dos=’todos’

Utilisez ensuite la même syntaxe que ci-dessus.


Vagrant

Si vous utilisez Vagrant VM et que cela se produit pour le provisionnement script, essayez de paramétrer binary option pour true :

# Shell provisioner, see: https://www.vagrantup.com/docs/provisioning/shell.html
config.vm.provision "shell" do |s|
  s.binary = true # Replace Windows line endings with Unix line endings.
  s.path = "script.sh"
end

Voir : Problèmes entre Windows CRLF et Unix LF dans Vagrant .

29voto

U2647 Points 310

Essayez d'exécuter la commande suivante

vim .bashrc
:set ff=unix
:wq!

20voto

user1010997 Points 78

Vous pouvez également ajouter l'option -o igncr à l'appel bash, par exemple

bash -x -o igncr script.sh

0 votes

Qu'est-ce que cela fait, et où puis-je obtenir plus de documentation à ce sujet ? Puis-je l'utiliser sous Linux ?

1 votes

Ceci exécute le script bash script. script.sh avec l'option igncr (= ignorer le retour chariot ( \r )). -x permet juste d'activer le traçage. Sous Linux, l'option igncr ne semble pas être disponible, il s'agit peut-être d'une option réservée à Cygwin.

14voto

Jesse Chisholm Points 633

Selon ce document Gist la solution consiste à créer un ~/.bash_profile (en HOME ) qui contient :

export SHELLOPTS
set -o igncr

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X