Quel est le meilleur printf ou écho?

16

Pour afficher le message et imprimer les données, deux commandes sont disponibles printfet echo.
Alors, comment ils ont utilisé différemment? Qu'est-ce qui est préférable?

Pandya
la source
8
Vous trouverez la réponse ici: unix.stackexchange.com/a/65819
user218740

Réponses:

27

De préférence et le plus utilisé n'est pas la même chose. Bien que ce printfsoit mieux pour de nombreuses raisons, la plupart des gens l'utilisent encore echocar la syntaxe est plus simple.

Les principales raisons pour lesquelles vous devriez préférer printfsont:

  1. echo n'est pas normalisé, il se comportera différemment sur différents systèmes.
  2. Il est difficile de prédire ce que vous exécutez réellement lorsque vous echo foo. Pour illustrer, sur mon système Debian:

    $ type -a echo
    echo is a shell builtin
    echo is /bin/echo
    

    Comme vous pouvez le voir, il existe deux echocommandes différentes , l'une est un shell (bash dans ce cas) intégré et l'autre est un binaire séparé. Notez qu'il a bashégalement une fonction printfintégrée mais son comportement est plus standardisé, donc c'est moins un problème (merci à @ RaduRădeanu pour l'avoir signalé).

  3. Étant donné que certaines (mais pas toutes) les implémentations des echocommutateurs de ligne de commande de support, il est difficile d'imprimer une chaîne qui commence par un -. Bien que de nombreux programmes prennent --en charge la fin des commutateurs et le début des arguments (par exemple, grep -- -a fileils trouveront des lignes filequi contiennent -a), ce echon'est pas le cas. Alors, comment avez-vous l' echoimpression -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 peut le faire facilement:

    $ printf -- '-n\n'
    -n
    $ printf '%s\n' -n
    -n
    $ printf '\055n\n' 
    -n
    

Pour plus d'informations que vous n'auriez jamais voulu savoir pourquoi printfest mieux que echo, consultez cette réponse à une question similaire sur http://unix.stackexchange.com :

/unix//a/65819/22222

terdon
la source
1
Donné une bonne réponse. Cela m'aide à préférer printfcomme meilleur interprète.
Pandya
3
Au point 2: il en va de même pour printf(voir type -a).
Radu Rădeanu
2
@ RaduRădeanu true, mais printfest défini de manière plus rigide dans POSIX et je pense que le code intégré suit le même standard. Les spécifications POSIX pour echod'autre part sont moins strictes et indiquent même explicitement qu'il y aura des différences entre les implémentations et cela printfdevrait être préféré.
terdon
Sensationnel. Il n'y a donc littéralement aucun avantage technique objectif à utiliser echo. Est-ce exact?
JamesTheAwesomeDude
1
@JamesTheAwesomeDude non, absolument aucun avantage technique que ce soit. La seule raison d'utiliser echoplutôt que printfc'est que le forma peut être plus simple. Si vous savez ce que vous imprimez, echo fooc'est plus rapide et plus facile à taper que printf 'foo\n'. En dehors de cela, lors de l'écriture de scripts où une variable doit être imprimée, il n'y a jamais de bonne raison d'utiliser echo.
terdon
4

Demander ce qui est préférable est en soi incomplet.

Si tout ce que l'on souhaite faire est d'émettre une ou plusieurs lignes de texte terminées par des retours à la ligne , alors l'écho suffit. Si quelque chose de plus intelligent est prévu, notamment en incluant une "ligne partielle" qui n'a pas la nouvelle ligne, alors printf est le meilleur à cet effet .

Monty Harder
la source
Selon l' echoimplémentation, "éviter la nouvelle ligne" se fait facilement echo -n. En fait, -nc'est la plus portable des fonctions d'écho. Selon POSIX, il est absent de SystemV mais présent dans la plupart des Unices.
terdon
J'ai travaillé dans suffisamment d'unités différentes pour ne même pas essayer d'éviter les nouvelles lignes avec écho. L'écriture de scripts portables sur SCO, AIX, HP-UX et Linux est ... difficile.
Monty Harder
Oh absolument, aucun argument là-bas. Tout ce que je dis, c'est que la nouvelle ligne est le moindre des problèmes. Tous les paris sont désactivés dès que vous essayez de porter sur un système non GNU. Je pense que vous pouvez compter sur les -nBSD et SystemV mais pour tout le reste, je n'en ai aucune idée.
terdon