Qual è meglio printf o echo?


Risposte:


27

Preferibile e più usato non è la stessa cosa. Mentre printfè meglio per molte ragioni, la maggior parte delle persone usa ancora echoperché la sintassi è più semplice.

I motivi principali per cui dovresti preferire printfsono:

  1. echo non è standardizzato, si comporterà diversamente su sistemi diversi.
  2. È difficile prevedere cosa stai effettivamente eseguendo quando lo fai echo foo. Per illustrare, sul mio sistema Debian:

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

    Come puoi vedere, ci sono due diversi echocomandi, uno è una shell (bash in questo caso) integrata e un altro è un binario separato. Nota che bashha anche un printfbuiltin ma il suo comportamento è più standardizzato, quindi è meno un problema (grazie a @ RaduRădeanu per averlo sottolineato).

  3. Poiché alcune (ma non tutte) implementazioni di echoopzioni della riga di comando supportano, è difficile stampare una stringa che inizia con a -. Mentre molti programmi supportano --per indicare la fine degli switch e l'inizio degli argomenti (ad esempio, grep -- -a filetroveranno le righe fileche contengono -a), echono. Quindi, come si echostampa -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 puoi farlo facilmente:

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

Per ulteriori informazioni di quante tu abbia mai desiderato sapere perché printfè meglio di echo, vedi questa risposta a una domanda simile su http://unix.stackexchange.com :

/unix//a/65819/22222


1
Data una buona risposta. Mi aiuta a preferire printfcome interprete migliore.
Pandya,

3
Al punto 2: lo stesso vale per printf(vedi type -a).
Radu Rădeanu,

2
@ RaduRădeanu vero, ma printfè più rigidamente definito in POSIX e penso che il builtin segua lo stesso standard. Le specifiche POSIX per echod'altra parte sono meno rigorose e affermano addirittura esplicitamente che ci saranno differenze tra le implementazioni e che printfdovrebbero essere preferite.
terdon,

Wow. Quindi ci sono letteralmente zero vantaggi tecnici oggettivi nell'uso echo. È corretto?
JamesTheAwesomeDude

1
@JamesTheAwesomeDude no, assolutamente nessun vantaggio tecnico di sorta. L'unica ragione per usare echopiuttosto che printfè che la forma può essere più semplice. Se sai cosa stai stampando, echo fooè più veloce e più facile da scrivere di printf 'foo\n'. A parte questo, quando si scrivono script in cui è necessario stampare una variabile, non c'è mai un buon motivo per usarlo echo.
terdon,

4

Chiedere quale sia preferibile è di per sé incompleto.

Se tutto ciò che si desidera fare è emettere una o più righe di testo terminate da una nuova riga , allora l'eco è sufficiente. Se si intende qualcosa di più intelligente, in particolare includendo una "linea parziale" che non ha la nuova riga, allora printf è la cosa migliore a tale scopo .


A seconda echodell'implementazione, "evitare la newline" è facilmente eseguibile echo -n. In effetti, -nè la più portatile delle funzionalità dell'eco. Secondo POSIX, è assente da SystemV ma presente nella maggior parte degli Unices.
terdon,

Ho lavorato in abbastanza diversi sistemi per non provare nemmeno a evitare nuove righe con l'eco. Scrivere script portatili su SCO, AIX, HP-UX e Linux è ... impegnativo.
Monty Harder,

Oh assolutamente, nessuna discussione lì. Tutto quello che sto dicendo è che la nuova riga è l'ultimo dei problemi. Tutte le scommesse vengono annullate non appena si tenta di effettuare il porting su un sistema non GNU. Penso che si possa fare affidamento su -nper i BSD e SystemV ma nient'altro, non ne ho idea.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.