echo
Una echo
implementación que se ajusta estrictamente a la especificación Single Unix agregará nuevas líneas si lo hace:
echo 'line1\nline2'
Pero ese no es un comportamiento confiable. De hecho, realmente no hay ningún comportamiento estándar que pueda esperar echo
.
Operandos
string
Una cadena que se escribirá en la salida estándar. Si el primer operando es -n
, o si alguno de los operandos contiene un carácter de < \
barra diagonal inversa> , los resultados están definidos por la implementación .
En sistemas conformes a XSI , si el primer operando es -n
, se tratará como una cadena, no como una opción . Las siguientes secuencias de caracteres se reconocerán en sistemas conformes a XSI dentro de cualquiera de los argumentos:
\a
- Escribe un <alert> .
\b
- Escribe un <retroceso> .
\c
- Suprima la <línea nueva> que de lo contrario sigue al argumento final en la salida. Todos los caracteres que siguen a los \c
en los argumentos serán ignorados.
\f
- Escriba un <form-feed> .
\n
- Escribir una <nueva línea> .
\r
- Escribe un <carriage-return> .
\t
- Escribe una <tab> .
\v
- Escribe un <vertical-tab> .
\\
- Escriba un carácter <backslash> .
\0num
- Escriba un valor de 8 bits que sea el número octal de cero, uno, dos o tres dígitos num
.
Por lo tanto, no existe una forma general de saber cómo escribir una nueva línea echo
, excepto que generalmente puede confiar en hacerlo echo
.
Un bash
shell normalmente no se ajusta a la especificación y maneja las -n
y otras opciones, pero incluso eso es incierto. Tu puedes hacer:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Y ni siquiera eso es necesario si bash
se ha construido con la opción de tiempo de construcción ...
--enable-xpg-echo-default
Haga que el echo
builtin expanda caracteres de escape con barra invertida de forma predeterminada, sin requerir la -e
opción. Esto establece el valor predeterminado de la xpg_echo
opción de shell en on
, lo que hace que el Bash se echo
comporte más como la versión especificada en la Especificación Single Unix, versión 3. Consulte Bash Builtins , para obtener una descripción de las secuencias de escape que echo
reconoce.
printf
Por otro lado, printf
el comportamiento es bastante manso en comparación.
RAZÓN FUNDAMENTAL
La printf
utilidad se agregó para proporcionar una funcionalidad que históricamente ha sido proporcionada por echo
. Sin embargo, debido a las diferencias irreconciliables en las diversas versiones echo
existentes, la versión tiene pocas características especiales, dejando estas a esta nueva printf
utilidad, que se basa en una en el sistema de la Novena Edición.
La sección DESCRIPCIÓN EXTENDIDA coincide casi exactamente con la printf()
función en el estándar ISO C, aunque se describe en términos de notación de formato de archivo en notación de formato de archivo XBD .
Maneja cadenas de formato que describen sus argumentos, que pueden ser cualquier cantidad de cosas, pero las cadenas son prácticamente %b
cadenas de yte o %s
trings literales . Además de los %f
ormats en el primer argumento, se comporta más como un %b
argumento de cadena yte, excepto que no maneja el \c
escape.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Ver ¿Por qué es printf
mejor que echo
? para más.
echo() printf
Puede escribir sus propios estándares conformes echo
como ...
echo(){
printf '%b ' "$@\n\c"
}
... que casi siempre debería hacer lo correcto automáticamente.
En realidad, no ... Eso imprime un literal \n
en la cola de los argumentos si el último argumento termina en un número impar de <backslashes> .
Pero esto no:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
obligatorio? puedes usarprintf
.