Câu trả lời:
Tốt hơn và được sử dụng rộng rãi nhất không phải là điều tương tự. Trong khi printf
tốt hơn vì nhiều lý do, hầu hết mọi người vẫn sử dụng echo
vì cú pháp đơn giản hơn.
Những lý do chính tại sao bạn nên thích printf
là:
echo
không được chuẩn hóa, nó sẽ hoạt động khác nhau trên các hệ thống khác nhau.Thật khó để dự đoán những gì bạn thực sự chạy khi bạn echo foo
. Để minh họa, trên hệ thống Debian của tôi:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
Như bạn có thể thấy, có hai echo
lệnh khác nhau , một lệnh là shell (bash trong trường hợp này) được xây dựng và một lệnh khác là nhị phân riêng. Lưu ý rằng bash
cũng có printf
nội dung dựng sẵn nhưng hành vi của nó được chuẩn hóa hơn nên ít gặp sự cố hơn (cảm ơn @ RaduRădeanu vì đã chỉ ra).
Do một số (nhưng không phải tất cả) các cài đặt echo
chuyển đổi dòng lệnh hỗ trợ, thật khó để in một chuỗi bắt đầu bằng a -
. Mặc dù nhiều chương trình hỗ trợ --
để biểu thị sự kết thúc của các công tắc và bắt đầu của các đối số (ví dụ: grep -- -a file
sẽ tìm thấy các dòng trong file
đó có chứa -a
), echo
nhưng không. Vì vậy, làm thế nào để bạn có echo
in -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
có thể làm điều này một cách dễ dàng:
$ printf -- '-n\n'
-n
$ printf '%s\n' -n
-n
$ printf '\055n\n'
-n
Để biết thêm thông tin mà bạn muốn biết về lý do tại sao printf
tốt hơn echo
, hãy xem câu trả lời này cho một câu hỏi tương tự trên http://unix.stackexchange.com :
printf
làm thông dịch viên tốt hơn.
printf
(xem type -a
).
printf
được định nghĩa chặt chẽ hơn trong POSIX và tôi nghĩ rằng nội dung theo tiêu chuẩn tương tự. Các POSIX thông số kỹ thuật cho echo
mặt khác ít nghiêm ngặt và thậm chí nhà nước một cách rõ ràng rằng sẽ có sự khác biệt giữa hiện thực và đó printf
nên được ưa thích.
echo
. Đúng không?
echo
chứ không phải printf
là forma có thể đơn giản hơn. Nếu bạn biết những gì bạn đang in, echo foo
sẽ nhanh hơn và dễ nhập hơn printf 'foo\n'
. Ngoài ra, khi viết các tập lệnh cần in một biến, không bao giờ có lý do chính đáng để sử dụng echo
.
Để hỏi cái nào thích hợp hơn là bản thân nó không đầy đủ.
Nếu tất cả một điều muốn làm là phát ra một hoặc nhiều dòng văn bản bị chấm dứt bởi dòng mới , thì tiếng vang đủ. Nếu có bất cứ điều gì thông minh hơn được dự định, cụ thể bao gồm "một phần dòng" không có dòng mới, thì printf là tốt nhất cho mục đích đó .
echo
thực hiện, "tránh dòng mới" có thể dễ dàng thực hiện với echo -n
. Trong thực tế, -n
là tính năng di động nhất của echo. Theo POSIX, nó không có trong SystemV nhưng có mặt trong hầu hết các Unices.
-n
BSD và SystemV nhưng bất cứ điều gì khác, tôi không biết.