Odpowiedzi:
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:
echo nie jest znormalizowany, będzie zachowywać się inaczej w różnych systemach.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).
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 :
printflepszego tłumacza.
printf(patrz type -a).
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.
echo. Czy to jest poprawne?
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.
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 .
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.
-nBSD i SystemV, ale cokolwiek innego, nie mam pojęcia.