‘\ r’: comando no encontrado – .bashrc / .bash_profile

Tengo ventanas, usando Cygwin, tratando de establecer JAVA_HOME permanentemente a través de mi archivo .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 

corriendo 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' 

No estoy seguro si tomé los comandos de un tutorial que fue diseñado para otro sistema o si me falta un paso. O el espacio en blanco hace que mis comandos no se ejecuten correctamente.

He analizado varias preguntas similares, pero no he encontrado una donde la pregunta tenga exactamente mi error.


Mi camino a casa:

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

Así que creo que los archivos deben colocarse en el lugar correcto.

Cuando todo lo demás falla en Cygwin …

Intenta ejecutar el comando dos2unix en el archivo en cuestión.

Puede ser útil cuando ve mensajes de error como este:

-bash: '\r': command not found

Los caracteres de nueva línea del estilo de Windows pueden causar problemas en Cygwin.

El comando dos2unix modifica los caracteres de nueva línea para que sean compatibles con Unix / Cygwin.

PRECAUCIÓN: el comando dos2unix modifica los archivos en su lugar , por lo que debe tomar precauciones si es necesario.

Si necesita conservar el archivo original, primero debe realizar una copia de seguridad.

Nota para los usuarios de Mac: el comando dos2unix no existe en Mac OS X.

Vea esta respuesta para una variedad de soluciones usando diferentes herramientas.


También hay un comando de unix2dos que hace lo contrario:

Modifica los caracteres de nueva línea de Unix para que sean compatibles con las herramientas de Windows.

Si abre un archivo con el Bloc de notas y todas las líneas se ejecutan juntas, pruebe el unix2dos filename .

Para aquellos que no tienen instalado dos2unix (y no quieren instalarlo):

Eliminar el carácter final que causa este error:

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

Explicación

La opción -i es para la edición en contexto, eliminamos el \r final \r directamente en el archivo de entrada. Por lo tanto, tenga cuidado de escribir el patrón correctamente.

Estoy usando cygwin y Windows7, el truco fue NO poner el set -o igncr en tu .bashrc sino poner todos los SHELLOPTS en tus variables de entorno bajo Windows. (Así que nada con unix / cygwin …) Creo que no funciona desde .bashrc porque “las gotas ya están chupadas”, como diríamos en alemán. 😉 Así que mis SHELLOPTS ven así

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

Si está utilizando un Cygwin reciente (por ejemplo, 1.7), también puede iniciar su .bashrc y .bash_profile con la siguiente línea, en la primera línea no comentada:

 # ~/.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 

Esto obligará a bash a ignorar los caracteres de retorno de carro ( \r ) utilizados en los separadores de línea de Windows.

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

Para los usuarios de WINDOWS con Notepad ++ (marcado con v6.8.3), puede corregir el archivo específico usando la opción – Editar -> conversión de EOL -> formato Unix / OSX

Y guarde su archivo de nuevo.

Editar: sigue funcionando en v7.5.1 (29 de agosto de 2017)

También puede agregar la opción -o igncr a la llamada bash, por ejemplo

 bash -x -o igncr script.sh 

TEXTO SUBLIME

Con sublime simplemente ve a

Ver -> Terminaciones de línea -> (seleccionar) Unix

Luego guarda el archivo. Arreglará este problema.

Tan fácil como eso!

El error:

'\r' : comando no encontrado

es causado por el shell que no reconoce las terminaciones de línea CRLF similares a Windows ( 0d 0a ) ya que solo espera LF ( 0a ).


Git

Si usas Git en Windows, asegúrate de haber seleccionado ‘Verificar como está ‘ durante la configuración. Luego, asegúrese de ejecutar: git config --global core.autocrlf false , por lo que Git no realizará conversiones al git config --global core.autocrlf false archivos de texto.


dos2unix

Si no está usando Git, simplemente necesita convertir estos archivos / scripts afectados nuevamente en terminaciones de línea tipo Unix (LF), ya sea por:

 dos2unix ~/.bashrc 

Nota: El comando dos2unix es parte del paquete dos2unix .

Editor Ex / Vim + tr

Si tiene Vim instalado, el siguiente comando debería corregir los archivos:

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

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

tr

Aquí está el método usando tr :

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

o:

 tr -d '\r' < filename > new_filename 

Nota: \r es equivalente a \015 .


sed

Puedes probar el siguiente comando:

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

recode

Los siguientes alias pueden ser útiles (que reemplaza el comando dos2unix ):

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

Fuente: Herramientas gratuitas de Unix (ssh, bash, etc.) en Windows .


perl

El siguiente comando perl puede convertir el archivo de DOS a formato Unix:

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

Fuente: pelando el ^ M.


tofrodos

En Linux, como Ubuntu, que no viene de serie con dos2unix o unix2dos , puede instalar el paquete tofrodos ( sudo apt-get install tofrodos ) y definir los siguientes alias:

 alias dos2unix='fromdos' alias unix2dos='todos' 

Luego use la misma syntax que arriba.


Vagabundo

Si está utilizando Vagrant VM y esto sucede para el script de aprovisionamiento, intente configurar la opción binary en 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 

Ver: Windows CRLF a Unix LF Issues in Vagrant .

gente que usa notepad ++ (6.8.1) para enviar scripts de shell de windows a linux.

configure lo siguiente en el bloc de notas ++ Editar -> Conversión EOL -> formato Unix / OSX

Según esta idea , la solución es crear un ~/.bash_profile (en el directorio HOME ) que contenga:

 export SHELLOPTS set -o igncr 

Yo tuve el mismo problema. Solución: edito el archivo con el editor de pspad y le doy un formato de Unix (Menú – Formato -> UNIX)

Creo que puede establecer este formato en su archivo con muchos otros editores

Para los usuarios de Emacs por ahí:

  1. Abre el archivo
  2. Mx set-buffer-file-coding-system
  3. Seleccione “Unix”

Esto actualizará los nuevos caracteres en el archivo para que sean de estilo Unix. Puede encontrar más información sobre “Representación de Newline” en Emacs aquí:

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

Nota: Los pasos anteriores se pueden hacer en un script de Emacs si se prefiere ejecutar esto desde la línea de comando.

Resuelto con Notepad ++:

1) Menú-> Editar-> Conversión EOL -> Formato Unix / OSX

2) luego guardar

Fijo

En EditPlus , haga esto desde el menú Document → File Format (CR/LF) → Change File Format... y luego elija el botón de opción Unix / Mac OS X

Es posible que se haya producido un problema debido al archivo / script creado / descargado desde una máquina de Windows. Intenta convertir al formato de archivo de Linux.

 dos2unix ./script_name.sh 

o

 dos2unix ~/.bashrc 

1. Elección

EditorConfig EditorConfig – es mi elección.


2. Relevancia

Esta respuesta es relevante para marzo de 2018. En el futuro, los datos de esta respuesta pueden estar obsoletos.

El autor de esta respuesta usó personalmente EditorConfig en March 2018.


3. Limitaciones

Necesita usar uno de los IDE / editores compatibles .


4. Argumentación

  1. Simplemente uso. Necesito configurar mi archivo .editorconfig 1 vez, donde creo mi proyecto, → Puedo olvidar algunos problemas específicos de plataforma, estilo e IDE .
  2. Cross-platform, cross-languages, cross-IDE, editores cruzados .

5. Ejemplo

5.1. Sencillo

Instalo el plugin EditorConfig para Sublime Text → mi editor de texto. Edito archivos en Sublime Text.

Por ejemplo, tengo el archivo sashacrlf.sh :

 echo "Sasha" & echo "Goddess!" & 

Ejecuto este archivo en Cygwin:

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

Creo un archivo .editorconfig en el mismo proyecto que sashacrlf.sh .

 [*.sh] end_of_line = lf 

Significa que, si guarda cualquier archivo con la extensión .sh en su proyecto en su editor, EditorConfig establece las terminaciones de línea UNIX para este archivo.

sashacrlf.sh en mi editor de texto de nuevo. sashacrlf.sh nuevamente:

 $ bash sashacrlf.sh Sasha Goddess! 

No puedo obtener resultados inesperados en la consola.

5.2. Múltiples extensiones de archivo

Por ejemplo, quiero tener terminaciones de línea UNIX en todos los archivos con extensiones .sh , .bashrc y .bash_profile . Agrego estas líneas a mi archivo .editorconfig :

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

Ahora, si guardo cualquier archivo con extensión .sh , .bashrc o .bash_profile , EditorConfig establece automáticamente el final de línea UNIX para este archivo.


6. Enlaces adicionales

  • Sitio oficial de EditorConfig .

Puede ser que haya usado Notepad ++ para crear / actualizar este archivo.

EOL (Editar-> Conversión EOL) La conversión por defecto es Windows.

Cambiar la conversión de EOL en Notepad ++

 Edit -> EOL Conversion -> Unix (LF) 

Si tiene el paquete vim instalado en su instalación de Cygwin, puede usar vim para solucionarlo sin encontrarlo y reemplazarlo. Inicie vim de la siguiente manera: vim filename.sh (a menudo también se alias a vi). Luego, escriba :set fileformat=unix , luego :wq (write & quit) para guardar sus cambios. (El : te pone en el modo de edición de vim).

Recomiendo esto sobre dos2unix ya que vim probablemente esté más comúnmente instalado.

Sin embargo, probablemente sea una mejor práctica configurar su editor de texto para que guarde los archivos que planea usar en un entorno Unix / Linux para tener un formato de texto Unix. Las respuestas dadas anteriormente para Notepad ++ son un buen ejemplo.

Nota adicional: si no está seguro de qué tipo es un archivo (DOS o Unix), puede usar el file filename.sh . Esto puede ayudar especialmente a depurar problemas más oscuros (como problemas de encoding al importar volcados de SQL provenientes de Windows).

Para otras opciones sobre cómo modificar el formato del archivo de texto, consulte este artículo de la base de conocimiento de IU.

En esta pregunta de StackOverflow se encuentra más información general sobre los scripts de Bash y los finales de línea.

intente ejecutar el siguiente comando

 vim .bashrc :set ff=unix :wq!