Cái nào tốt hơn printf hay echo?


16

Để hiển thị thông báo và dữ liệu in, có hai lệnh có sẵn printfecho.
Sau đó, họ sử dụng khác nhau như thế nào? Cái nào thích hợp hơn?


8
Bạn sẽ tìm thấy câu trả lời ở đây: unix.stackexchange.com/a/65819
user218740

Câu trả lời:


27

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 printftốt hơn vì nhiều lý do, hầu hết mọi người vẫn sử dụng echovì cú pháp đơn giản hơn.

Những lý do chính tại sao bạn nên thích printflà:

  1. 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.
  2. 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 echolệ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 bashcũng có printfnộ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).

  3. Do một số (nhưng không phải tất cả) các cài đặt echochuyể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 filesẽ tìm thấy các dòng trong fileđó có chứa -a), echonhưng không. Vì vậy, làm thế nào để bạn có echoin -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 printftố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 :

/unix//a/65819/22222


1
Đưa ra câu trả lời tốt. Nó giúp tôi thích printflàm thông dịch viên tốt hơn.
Pandya

3
Tại điểm 2: điều tương tự cũng đúng với printf(xem type -a).
Radu Rădeanu

2
@ RaduRădeanu đúng, nhưng 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 echomặ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à đó printfnên được ưa thích.
terdon

Ồ Vì vậy, có nghĩa là không có lợi thế kỹ thuật khách quan để sử dụng echo. Đúng không?
JamesTheAwgieDude

1
@JamesTheAwgieDude không, hoàn toàn không có lợi thế kỹ thuật nào. Lý do duy nhất để sử dụng echochứ không phải printflà forma có thể đơn giản hơn. Nếu bạn biết những gì bạn đang in, echo foosẽ 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.
terdon

4

Để 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 đó .


Tùy thuộc vào việc echothự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ế, -nlà 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.
terdon

Tôi đã làm việc trong đủ các thông báo khác nhau để thậm chí không cố gắng tránh các dòng mới với tiếng vang. Viết các tập lệnh di động trên SCO, AIX, HP-UX và Linux là ... thách thức.
Monty Harder

Oh hoàn toàn, không có tranh luận ở đó. Tất cả tôi đang nói rằng dòng mới là vấn đề ít nhất. Tất cả các cược được tắt ngay khi bạn cố gắng chuyển sang một hệ thống không phải GNU. Tôi nghĩ bạn có thể dựa vào -nBSD và SystemV nhưng bất cứ điều gì khác, tôi không biết.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.