14 votos

el carácter echo newline no funciona en bash

Tengo bash script que tiene un montón de echo y también he puesto un alias a echo a echo -e tanto en .bash_profile y .bashrc para que las nuevas líneas se impriman correctamente para una declaración como echo 'Hello\nWorld' la salida debe ser

Hello
World

pero la salida que obtengo es

Hello\nWorld

Incluso intenté usar shopt -s expand_aliases en el script, no ayuda

Estoy ejecutando mi script como bash /scripts/scriptnm.sh si lo ejecuto como . /scripts/scriptnm.sh Estoy obteniendo la salida deseada...

20voto

mkaito Puntos 136

La historia mixta de echo significa que su funcionamiento por defecto varía de Shell a Shell. POSIX especifica que el resultado de echo es "definido por la implementación" si el primer argumento es -n o cualquier argumento contiene una barra invertida.

Es más fiable utilizar printf (ya sea como comando incorporado o como comando externo) donde el comportamiento está más definido: los escapes de barra invertida al estilo C y los especificadores de formato están soportados en la cadena de formato (el primer argumento).

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

Puede controlar la expansión de las secuencias de escape de barras invertidas de bash 's echo comando incorporado con el xpg_echo Shell.

Colóquelo en la parte superior de cualquier bash script para hacer echo expande automáticamente los escapes de barra invertida sin tener que añadir -e a cada comando de eco.

shopt -s xpg_echo
echo 'foo\nbar'

7voto

Damian Powell Puntos 162

La práctica recomendada es utilizar printf para todos los nuevos scripts.

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"

6voto

Nick Dixon Puntos 154

Cuando se utiliza bash myfile.sh Bash se ejecuta en modo "batch", en un separar proceso, y no leer su perfil o rcfile.

Cuando se utiliza . myfile.sh el archivo es de origen por el proceso actual de Shell (como si su contenido fuera escrito por usted), por lo tanto ve sus alias actualmente definidos.

En general, es una muy mala idea escribir scripts que dependan de cualquier configuración particular de scripts, especialmente alias, a menos que los defina en el script sí mismo. ( Nunca dependen del usuario .bashrc (aunque sea el suyo propio).

2voto

mivk Puntos 334

Esto funciona bien en el terminal

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

guardar en un archivo y hacerlo exeutable (chmod +x)

ejecutar como ./su_archivo

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: