Który jest lepszy printf lub echo?

16

Do wyświetlania wiadomości i danych drukowania dostępne są dwa polecenia printfi echo.
Więc jak inaczej wykorzystali? Który jest bardziej preferowany?

Pandya
źródło
8
Odpowiedź znajdziesz tutaj: unix.stackexchange.com/a/65819
user218740

Odpowiedzi:

27

Preferowane i najczęściej stosowane to nie to samo. Chociaż printfjest lepszy z wielu powodów, większość ludzi nadal korzysta z niego, echoponieważ składnia jest prostsza.

Główne powody, dla których powinieneś preferować printfto:

  1. echo nie jest znormalizowany, będzie zachowywać się inaczej w różnych systemach.
  2. Trudno jest przewidzieć, co tak naprawdę biegasz echo foo. Aby to zilustrować, w moim systemie Debian:

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

    Jak widać, istnieją dwie różne echokomendy, jedna to wbudowana powłoka (w tym przypadku bash), a druga to osobny plik binarny. Zauważ, że bashma również printfwbudowane, ale jego zachowanie jest bardziej znormalizowane, więc nie stanowi większego problemu (dzięki @ RaduRădeanu za wskazanie go).

  3. Ponieważ niektóre (ale nie wszystkie) implementacje echoprzełączników linii poleceń obsługujących, trudno jest wydrukować ciąg rozpoczynający się od -. Podczas gdy wiele programów obsługuje --koniec przełączników i początek argumentów (na przykład grep -- -a fileznajdzie wiersze w nim filezawarte -a), echonie ma. Jak masz echowydruk -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 łatwo to zrobić:

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

Aby uzyskać więcej informacji, niż kiedykolwiek chciałeś wiedzieć, dlaczego printfjest lepszy niż echo, zapoznaj się z odpowiedzią na podobne pytanie na stronie http://unix.stackexchange.com :

/unix//a/65819/22222

terdon
źródło
1
Biorąc pod uwagę dobrą odpowiedź. Pomaga mi to wybrać printflepszego tłumacza.
Pandya
3
W punkcie 2: to samo dotyczy printf(patrz type -a).
Radu Rădeanu
2
@ RaduRădeanu to prawda, ale w POSIX printfjest bardziej rygorystycznie zdefiniowane i myślę, że wbudowany jest zgodny z tym samym standardem. POSIX specyfikacje dla echodrugiej strony są mniej rygorystyczne, a nawet wyraźnie stwierdzają, że będą różnice pomiędzy implementacjami i które printfpowinny być preferowane.
terdon
Łał. Tak więc korzystanie z nich jest dosłownie zerowe echo. Czy to jest poprawne?
JamesTheAwesomeDude
1
@JamesTheAwesomeDude nie, absolutnie nie ma żadnej przewagi technicznej. Jedynym powodem, aby używać echoraczej niż printfjest to, że forma może być prostsze. Jeśli wiesz, co drukujesz, echo foojest szybsze i łatwiejsze do pisania niż printf 'foo\n'. Poza tym podczas pisania skryptów, w których należy wydrukować zmienną, nigdy nie ma dobrego powodu, aby z niej korzystać echo.
terdon
4

Pytanie o to, co jest lepsze, samo w sobie jest niepełne.

Jeśli wszystko, co chcesz zrobić, to wyemitować jeden lub więcej wierszy tekstu zakończonych znakami nowej linii , wystarczy echo. Jeśli zamierzone jest coś bardziej sprytnego, w szczególności „linia częściowa”, która nie ma nowej linii, to do tego celu najlepiej nadaje się printf .

Monty Harder
źródło
W zależności od echoimplementacji można łatwo „uniknąć nowej linii” echo -n. W rzeczywistości -njest najbardziej przenośną z funkcji echa. Według POSIX nie ma go w SystemV, ale występuje w większości Unices.
terdon
Pracowałem w wystarczająco wielu różnych jednorożcach, aby nawet nie próbować unikać nowej linii za pomocą echa. Pisanie skryptów, które są przenośne w SCO, AIX, HP-UX i Linux jest ... trudne.
Monty Harder
Och, absolutnie, nie ma żadnych argumentów. Mówię tylko, że nowa linia to najmniejszy problem. Wszystkie zakłady są wyłączone, gdy tylko spróbujesz przenieść się do systemu innego niż GNU. Myślę , że możesz polegać na -nBSD i SystemV, ale cokolwiek innego, nie mam pojęcia.
terdon