¿Cuál es mejor printf o echo?

16

Para mostrar mensajes e imprimir datos hay dos comandos disponibles printfy echo.
Entonces, ¿qué tan diferente usaron? ¿Cuál es más preferible?

Pandya
fuente
8
Encontrará la respuesta aquí: unix.stackexchange.com/a/65819
user218740

Respuestas:

27

Preferible y más ampliamente utilizado no es lo mismo. Si bien printfes mejor por muchas razones, la mayoría de las personas todavía lo usan echoporque la sintaxis es más simple.

Las principales razones por las que debería preferir printfson:

  1. echo no está estandarizado, se comportará de manera diferente en diferentes sistemas.
  2. Es difícil predecir lo que realmente estás ejecutando cuando lo haces 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 echocomandos diferentes , uno es un shell (bash en este caso) integrado y otro es un binario separado. Tenga en cuenta que bashtambién tiene una función printfincorporada, pero su comportamiento está más estandarizado, por lo que es un problema menor (gracias a @ RaduRădeanu por señalarlo).

  3. Dado que algunas (pero no todas) las implementaciones de los echoconmutadores de línea de comando de soporte, es difícil imprimir una cadena que comienza con a -. Si bien muchos programas admiten --significar el final de los cambios y el comienzo de los argumentos (por ejemplo, grep -- -a fileencontrará líneas fileque contienen -a), echono lo hace. Entonces, ¿cómo tienes echoimpresión -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 por qué printfes mejor echo, consulte esta respuesta a una pregunta similar en http://unix.stackexchange.com :

/unix//a/65819/22222

terdon
fuente
1
Dada una buena respuesta. Me ayuda a preferir printfcomo mejor intérprete.
Pandya
3
En el punto 2: lo mismo es cierto para printf(ver type -a).
Radu Rădeanu
2
@ RaduRădeanu es cierto, pero printfestá más rígidamente definido en POSIX y creo que el incorporado sigue el mismo estándar. Las especificaciones POSIX para, echopor otro lado, son menos estrictas e incluso afirman explícitamente que habrá diferencias entre las implementaciones y eso printfdebería preferirse.
terdon
Guau. Por lo tanto, hay literalmente cero ventajas técnicas objetivas para usar echo. ¿Es eso correcto?
JamesTheAwesomeDude
1
@JamesTheAwesomeDude no, absolutamente ninguna ventaja técnica en absoluto. La única razón para usar en echolugar de printfes que la forma puede ser más simple. Si sabe lo que está imprimiendo, echo fooes más rápido y fácil de escribir que printf 'foo\n'. Aparte de eso, cuando se escriben scripts donde se necesita imprimir una variable, nunca hay una buena razón para usarla echo.
terdon
4

Preguntar cuál es preferible es en sí mismo incompleto.

Si todo lo que se desea hacer es emitir una o más líneas de texto terminadas 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 tiene la nueva línea, entonces printf es lo mejor para ese propósito .

Monty Harder
fuente
Dependiendo de la echoimplementación, "evitar la nueva línea" se hace fácilmente con echo -n. De hecho, -nes la más portátil de las características de echo. Según POSIX, está ausente de SystemV pero presente en la mayoría de los Unices.
terdon
He trabajado en suficientes unidades diferentes para ni siquiera intentar evitar nuevas líneas con eco. Escribir scripts que sean portátiles en SCO, AIX, HP-UX y Linux es ... un desafío.
Monty Harder
Ah, absolutamente, no hay discusión allí. Todo lo que digo es que la nueva línea es el menor de los problemas. Todas las apuestas se desactivan tan pronto como intentas transferir a un sistema que no sea GNU. Yo creo que puede confiar en el -nde los BSD y SystemV pero todo lo demás, no tengo ni idea.
terdon