web-dev-qa-db-fra.com

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

J'utilise Windows pour utiliser Cygwin et essayer de définir Java_HOME de manière permanente via mon fichier .bashrc.

. 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 cours d'exécution:

-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 pris les commandes d'un tutoriel destiné à un autre système ou s'il me manque une étape. Ou bien les espaces empêchent mes commandes de fonctionner correctement.

J'ai examiné plusieurs questions similaires, mais je n'en ai trouvé aucune où la question comporte exactement mon erreur.


Mon chemin chez moi:

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

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

246
Jasmine

Quand tout échoue dans Cygwin ...

Essayez d’exécuter la commande dos2unix sur le fichier en question.

Cela peut aider lorsque vous voyez des messages d'erreur comme celui-ci:

-bash: '\r': command not found

Les caractères de nouvelle ligne de style Windows peuvent causer des problèmes dans Cygwin.

La commande dos2unix modifie les caractères de nouvelle ligne afin qu’ils soient compatibles Unix/Cygwin.

ATTENTION: la commande dos2unix modifie les fichiers à la place , prenez donc des précautions si nécessaire.

Si vous devez conserver le fichier d'origine, vous devez d'abord le sauvegarder.

Remarque pour les utilisateurs Mac: La commande dos2unix n'existe pas sous Mac OS X.

Découvrez cette réponse pour une variété de solutions utilisant différents outils.


Il existe également une commande unix2dos qui effectue l'inverse:

Il modifie les caractères de nouvelle ligne Unix pour les rendre compatibles avec les outils Windows.

Si vous ouvrez un fichier avec le Bloc-notes et que toutes les lignes fonctionnent ensemble, essayez unix2dos filename.

316
jahroy

Pour ceux qui n'ont pas dos2unix (et ne veulent pas l'installer):

Supprimez le dernier caractère \r qui a provoqué cette erreur:

sed -i 's/\r$//' filename


Explication:

L'option -i est destinée à l'édition sur place , nous supprimons le \r final directement dans le fichier d'entrée. Veillez donc à taper correctement le motif.

193
Michael P. Bazos

Pour WINDOWS utilisateurs avec Notepad ++ (coché avec la version 6.8.3), vous pouvez corriger le fichier en utilisant l'option - Modifier -> Conversion EOL -> Format Unix/OSX

Et sauvegardez votre fichier à nouveau.

Edit: fonctionne toujours dans la v7.5.1 (29 août 2017)

42
Ray Oei

J'utilise cygwin et Windows7, l'astuce n'était PAS de mettre le set -o igncr dans votre fichier .bashrc, mais de placer l'ensemble SHELLOPTS dans vos variables d'environnement sous Windows. (Donc, rien avec Unix/Cygwin ...) Je pense que cela ne fonctionne pas à partir de .bashrc parce que "les gouttes sont déjà aspirées" comme on dirait en allemand. ;-) Donc, mon SHELLOPTS ressemble à ceci

braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor
37
DietmarTheMachine

Si vous utilisez un Cygwin récent (par exemple 1.7), vous pouvez également démarrer votre .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

Ceci forcera bash à ignorer les caractères de retour chariot (\r) utilisés dans les séparateurs de lignes Windows.

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

26
user1461760

TEXT SUBLIME

Avec sublime vous allez juste à

Affichage -> fins de lignes -> (sélectionner) Unix

Puis enregistrez le fichier. Va résoudre ce problème.

Aussi simple que ça!

23
Alvaro Joao

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

bash -x -o igncr script.sh
17
user1010997

L'erreur:

'\r': commande non trouvée

est causé par l’incapacité de Shell à reconnaître les fins de ligne CRLF de type Windows (0d 0a) car il s’attend uniquement à LF (0a).


Git

Si vous utilisez Git sous Windows, assurez-vous que vous avez sélectionné " Commander tel quel " lors de l'installation. Assurez-vous ensuite que vous exécutez: git config --global core.autocrlf false, afin que Git n’effectue aucune conversion lors de l’extraction ou de la validation de fichiers texte.


dos2unix

Si vous n'utilisez pas Git, vous devez simplement reconvertir ces fichiers/scripts concernés en fins de ligne de type Unix, soit de l'une des manières suivantes:

dos2unix ~/.bashrc

Remarque: La commande dos2unix fait partie du package dos2unix.

Editeur Ex/Vim + tr

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

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

Alias ​​utile: 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

Remarque: 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 (pour remplacer la commande dos2unix]:

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

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


Perl

La commande Perl suivante peut convertir le fichier de DOS au format Unix:

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

Source: dépouillant le ^ M .


tofrodos

Sous Linux, comme Ubuntu, qui n’est pas fourni en standard avec dos2unix ou unix2dos, vous pouvez installer le package tofrodos (Sudo apt-get install tofrodos) et définir les alias suivants:

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

Ensuite, utilisez la même syntaxe que ci-dessus.


Vagabond

Si vous utilisez Vagrant VM et que cela se produise pour le script d'approvisionnement, essayez de définir l'option binary sur 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: Windows CRLF vers Unix LF Problèmes dans Vagrant .

12
kenorb

essayez d'exécuter la commande suivante

vim .bashrc
:set ff=unix
:wq!
9
U2647

Selon Gist , la solution consiste à créer un ~/.bash_profile (dans le répertoire HOME) contenant:

export SHELLOPTS
set -o igncr
8
Jesse Chisholm

les gens qui utilisent notepad ++ (6.8.1) pour expédier des scripts Shell de Windows à Linux.

définir les éléments suivants dans le Bloc-notes ++ Edition -> Conversion EOL -> Format Unix/OSX

3
viru

Résolu avec Notepad ++:

1) Menu-> Edition-> Conversion EOL-> Format Unix/OSX

2) puis sauvegarder

Fixé

3

J'ai eu le même problème. Solution: J'édite le fichier avec l'éditeur pspad et lui donne un format unix (Menu - Format -> UNIX)

Je crois que vous pouvez définir ce format dans votre fichier avec de nombreux autres éditeurs.

2
israel

Peut-être que vous avez utilisé notepad ++ pour créer/mettre à jour ce fichier.

EOL (Édition-> Conversion EOL) La conversion par défaut est Windows.

Changer la conversion EOL dans Notepad ++

Edit -> EOL Conversion -> Unix (LF)
2
Faiz Ahmed

Pour les utilisateurs d'Emacs:

  1. Ouvrir le fichier
  2. M-x set-buffer-file-coding-system
  3. Sélectionnez "unix"

Cela mettra à jour les nouveaux caractères du fichier pour qu'ils soient de style Unix. Plus d'infos sur "Newline Representation" à Emacs peuvent être trouvées ici:

http://ergoemacs.org/emacs/emacs_line_ending_char.html

Remarque: Les étapes ci-dessus peuvent être transformées en script Emacs si vous préférez l’exécuter à partir de la ligne de commande.

2
user2548343

1. choix

EditorConfig EditorConfig - est mon choix.


2. Pertinence

Cette réponse est pertinente pour mars 2018. À l'avenir, les données de cette réponse pourraient être obsolètes.

Auteur de cette réponse a personnellement utilisé EditorConfig à mars 2018.


3. Limites

Vous devez utiliser un des éditeurs/éditeurs pris en charge .


4. Argumentation

  1. Simplement utiliser. J'ai besoin de définir mon fichier .editorconfig _ une fois, où je crée mon projet, → je peux oublier des problèmes spécifiques à la plate-forme, au style et à l'IDE .
  2. Multiplateforme, multilingue, multi-IDE, multi-éditeurs .

5. Exemple

5.1. Facile

J'installe le plugin EditorConfig pour Sublime Text → mon éditeur de texte. J'édite des fichiers en texte Sublime.

Par exemple, j'ai le fichier sashacrlf.sh:

echo "Sasha" &
echo "Goddess!" &

Je lance ce fichier dans Cygwin:

$ bash sashacrlf.sh
Sasha
sashacrlf.sh: line 1: $'\r': command not found
Goddess!

Je crée un fichier .editorconfig dans le même projet que sashacrlf.sh.

[*.sh]
end_of_line = lf

Cela signifie que si vous enregistrez un fichier portant l'extension .sh dans votre projet dans votre éditeur, EditorConfig définit les fins de ligne UNIX pour ce fichier.

Je sauvegarde à nouveau sashacrlf.sh dans mon éditeur de texte. Je lance à nouveau sashacrlf.sh:

$ bash sashacrlf.sh
Sasha
Goddess!

Je ne peux pas obtenir de sortie inattendue dans la console.

5.2. Extensions de fichiers multiples

Par exemple, je souhaite avoir des fins de ligne UNIX dans tous les fichiers portant les extensions .sh, .bashrc et .bash_profile. J'ajoute ces lignes à mon fichier .editorconfig:

[*.{sh,bashrc,bash_profile}]
end_of_line = lf

Maintenant, si j’enregistre un fichier avec l’extension .sh, .bashrc ou .bash_profile, EditorConfig définit automatiquement la fin de la ligne UNIX pour ce fichier.


6. Liens supplémentaires

0

Dans EditPlus , vous le faites à partir du menu Document → File Format (CR/LF) → Change File Format..., puis choisissez le bouton radio Unix / Mac OS X.

0
Danny Schoemann

Si le package vim est installé sur votre installation Cygwin, vous pouvez utiliser vim pour résoudre ce problème sans rechercher ni remplacer. Démarrez vim comme suit: vim filename.sh (il est souvent associé à vi également). Ensuite, tapez :set fileformat=unix, puis :wq (write & quit) pour enregistrer vos modifications. (Le : vous met en mode d'édition de vim.)

Je recommande ceci sur dos2unix car vim est probablement plus couramment installé.

Cependant, il est probablement recommandé de configurer votre éditeur de texte pour qu'il enregistre les fichiers que vous prévoyez d'utiliser dans un environnement Unix/Linux au format texte Unix. Les réponses données ci-dessus pour Notepad ++ sont un bon exemple.

Remarque supplémentaire: Si vous n'êtes pas sûr du type de fichier (DOS ou Unix), vous pouvez utiliser le file filename.sh. Cela peut notamment aider au débogage de problèmes plus obscurs (tels que des problèmes de codage lors de l'importation de vidages SQL provenant de Windows).

Pour d'autres options sur la façon de modifier le formatage d'un fichier texte, voir cet article de la base de connaissances I

Vous trouverez plus d'informations de base sur les scripts Bash et les fins de ligne sur cette question de StackOverflow .

0
Evan Donovan

Ce problème est peut-être dû au fichier/script créé/téléchargé à partir d'un ordinateur Windows. S'il vous plaît essayez de convertir en format de fichier linux.

dos2unix ./script_name.sh

ou

dos2unix ~/.bashrc
0
Walk