
Para mostrar mensajes e imprimir datos, hay dos comandos disponibles printf
y echo
.
Entonces, ¿qué tan diferente lo usaban? ¿Cuál es más preferible?
Respuesta1
Preferible y más utilizado no es lo mismo. Si bien printf
es mejor por muchas razones, la mayoría de la gente todavía lo usa echo
porque la sintaxis es más simple.
Las principales razones por las que deberías preferir printf
son:
echo
no está estandarizado, se comportará de manera diferente en diferentes sistemas.Es difícil predecir lo que estás ejecutando realmente cuando
echo foo
. Para ilustrar, en mi sistema Debian:$ type -a echo echo is a shell builtin echo is /bin/echo
Como puede ver, hay dos
echo
comandos diferentes, uno es un shell incorporado (bash en este caso) y otro es un binario separado. Tenga en cuenta quebash
también tiene unaprintf
función incorporada, pero su comportamiento está más estandarizado, por lo que es un problema menor (gracias a @RaduRădeanu por señalarlo).Dado que algunas (pero no todas) implementaciones de
echo
soporte para cambios de línea de comando, es difícil imprimir una cadena que comience con-
. Si bien muchos programas admiten--
indicar el final de los cambios y el comienzo de los argumentos (por ejemplo,grep -- -a file
encontrará líneasfile
que contengan-a
),echo
no lo hace. Entonces, ¿cómo seecho
imprime-n
?$ echo -n ## no output $ echo '-n' ## no output $ echo "-n" ## no output $ echo \-n ## no output $ echo -e '\055n' ## using the ASCII code works but only on implementations -n ## that support -e
printf
puede hacer esto fácilmente:$ printf -- '-n\n' -n $ printf '%s\n' -n -n $ printf '\055n\n' -n
Para obtener más información de la que siempre quiso saber sobre por qué printf
es mejor que echo
, consulte esta respuesta a una pregunta similar enhttp://unix.stackexchange.com:
Respuesta2
Preguntar cuál es preferible es en sí mismo incompleto.
Si todo lo que uno desea hacer es emitir una o más líneas de textoterminado por nuevas líneas, entonces el eco es suficiente. Si se pretende algo más inteligente, incluyendo específicamente una "línea parcial" que no tenga la nueva línea, entonces printf es lo mejorpara ese propósito.