Was ist besser printf oder echo?

15

Für die Anzeige von Mitteilungs- und Druckdaten stehen zwei Befehle zur Verfügung printfund echo.
Wie unterschiedlich haben sie sich dann verhalten? Was ist vorzuziehen?

Pandya
quelle
8
Die Antwort finden Sie hier: unix.stackexchange.com/a/65819
user218740

Antworten:

26

Bevorzugt und am weitesten verbreitet ist nicht dasselbe. Obwohl printfes aus vielen Gründen besser ist, verwenden die meisten Leute es trotzdem, echoweil die Syntax einfacher ist.

Die Hauptgründe, warum Sie bevorzugen sollten, printfsind:

  1. echo ist nicht standardisiert, es wird sich auf verschiedenen Systemen unterschiedlich verhalten.
  2. Es ist schwer vorherzusagen, was Sie tatsächlich laufen, wenn Sie echo foo. Zur Veranschaulichung auf meinem Debian-System:

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

    Wie Sie sehen, gibt es zwei verschiedene echoBefehle, einen Shell-Befehl (in diesem Fall Bash) und einen separaten Binärbefehl. Beachten Sie, dass bashauch eine integrierte printfFunktion vorhanden ist, deren Verhalten jedoch standardisierter ist, sodass es weniger problematisch ist (danke an @ RaduRădeanu für den Hinweis).

  3. Da einige (aber nicht alle) Implementierungen von echoBefehlszeilenschaltern Unterstützung bieten, ist es schwierig, eine Zeichenfolge zu drucken, die mit a beginnt -. Während viele Programme unterstützen --, um das Ende von Schaltern und den Anfang von Argumenten zu kennzeichnen (zum Beispiel grep -- -a filefinden Sie Zeilen file, die enthalten -a), echonicht. Also, wie haben Sie echodrucken -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 das geht ganz einfach:

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

Weitere Informationen, als Sie jemals wissen wollten, warum printfdas besser ist als echo, finden Sie in dieser Antwort auf eine ähnliche Frage unter http://unix.stackexchange.com :

/unix//a/65819/22222

terdon
quelle
1
Gute Antwort gegeben. Es hilft mir printfals besserer Dolmetscher vorzuziehen .
Pandya
3
Zu Punkt 2: Gleiches gilt für printf(siehe type -a).
Radu Rădeanu
1
@ RaduRădeanu stimmt, printfist aber in POSIX strenger definiert und ich denke das Builtin folgt dem gleichen Standard. Die POSIX- Spezifikationen für echohingegen sind weniger streng und geben sogar ausdrücklich an, dass es Unterschiede zwischen den Implementierungen geben wird und dass printfdies bevorzugt werden sollte.
Terdon
Beeindruckend. Die Verwendung bietetecho also buchstäblich keine objektiven technischen Vorteile . Ist das korrekt?
JamesTheAwesomeDude
@JamesTheAwesomeDude nein, absolut kein technischer Vorteil. Der einzige Grund , zu verwenden , echoanstatt printfist , dass die forma einfacher sein kann. Wenn Sie wissen, was Sie drucken, echo fooist es schneller und einfacher zu tippen als printf 'foo\n'. Abgesehen davon gibt es beim Schreiben von Skripten, in denen eine Variable gedruckt werden muss, nie einen guten Grund für die Verwendung echo.
Terdon
4

Zu fragen, was vorzuziehen ist, ist selbst unvollständig.

Wenn man nur eine oder mehrere durch Zeilenumbrüche abgeschlossene Textzeilen ausgeben möchte , reicht das Echo aus. Wenn etwas Klügeres beabsichtigt ist, insbesondere eine "Teilzeile", die keine neue Zeile enthält, ist printf für diesen Zweck am besten geeignet .

Monty Harder
quelle
Abhängig von der echoImplementierung ist "Vermeiden des Zeilenumbruchs" problemlos möglich echo -n. In der Tat -nist die tragbarste von Echo-Funktionen. Laut POSIX fehlt es in SystemV, ist aber in den meisten Unices vorhanden.
Terdon
Ich habe in genug verschiedenen Unices gearbeitet, um nicht einmal zu versuchen, Newlines mit Echo zu vermeiden. Das Schreiben von Skripten für SCO, AIX, HP-UX und Linux ist eine Herausforderung.
Monty Harder
Oh, absolut kein Streit. Ich sage nur, dass die Newline das geringste Problem ist. Alle Wetten sind deaktiviert, sobald Sie versuchen, auf ein Nicht-GNU-System zu portieren. Ich denke man kann sich auf das -nfür die BSDs und SystemV verlassen aber alles andere habe ich keine Ahnung.
Terdon