Printf atau gema mana yang lebih baik?

16

Untuk menampilkan pesan dan mencetak data ada dua perintah yang tersedia printfdan echo.
Lalu bagaimana berbeda cara mereka menggunakannya? Mana yang lebih disukai?

Pandya
sumber
8
Anda akan menemukan jawabannya di sini: unix.stackexchange.com/a/65819
user218740

Jawaban:

27

Lebih disukai dan paling banyak digunakan bukanlah hal yang sama. Meskipun printflebih baik karena berbagai alasan, kebanyakan orang masih menggunakan echosintaksisnya lebih sederhana.

Alasan utama mengapa Anda harus memilih printfadalah:

  1. echo tidak dibakukan, itu akan berperilaku berbeda pada sistem yang berbeda.
  2. Sulit untuk memprediksi apa yang sebenarnya Anda jalankan saat Anda echo foo. Sebagai ilustrasi, pada sistem Debian saya:

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

    Seperti yang Anda lihat, ada dua echoperintah yang berbeda , satu adalah shell (bash dalam hal ini) builtin dan yang lainnya adalah biner yang terpisah. Catatan yang bashjuga memiliki printfbuiltin tetapi perilakunya lebih terstandarisasi sehingga kurang menjadi masalah (terima kasih kepada @ RaduRădeanu untuk menunjukkannya).

  3. Karena beberapa (tetapi tidak semua) implementasi dari echoswitch baris perintah dukungan, sulit untuk mencetak string yang dimulai dengan a -. Sementara banyak program mendukung --untuk menandakan akhir switch dan awal argumen (misalnya, grep -- -a fileakan menemukan baris di filedalamnya -a), echotidak. Jadi, bagaimana Anda echomencetak -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 dapat melakukan ini dengan mudah:

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

Untuk informasi lebih dari yang Anda ingin tahu mengapa printflebih baik daripada echo, lihat jawaban ini untuk pertanyaan serupa di http://unix.stackexchange.com :

/unix//a/65819/22222

terdon
sumber
1
Diberikan jawaban yang bagus. Ini membantu saya untuk memilih printfpenerjemah yang lebih baik.
Pandya
3
Pada poin 2: hal yang sama berlaku untuk printf(lihat type -a).
Radu Rădeanu
2
@ RaduRădeanu benar, tetapi printflebih kaku didefinisikan dalam POSIX dan saya pikir builtin mengikuti standar yang sama. Sebaliknya, spesifikasi POSIX untuk echokurang ketat dan bahkan secara eksplisit menyatakan bahwa akan ada perbedaan antara implementasi dan yang printfharus dipilih.
terdon
Wow. Jadi sebenarnya tidak ada keuntungan teknis obyektif untuk digunakan echo. Apakah itu benar?
JamesTheAwesomeDude
1
@JamesTheAwesomeDude tidak, sama sekali tidak ada keuntungan teknis apa pun. Satu-satunya alasan untuk menggunakan echodaripada printfkarena forma bisa lebih sederhana. Jika Anda tahu apa yang Anda cetak, echo foolebih cepat dan lebih mudah untuk mengetik daripada printf 'foo\n'. Selain itu, ketika menulis skrip di mana variabel perlu dicetak, tidak pernah ada alasan yang baik untuk digunakan echo.
terdon
4

Untuk bertanya mana yang disukai itu sendiri tidak lengkap.

Jika semua yang ingin dilakukan adalah memancarkan satu atau lebih baris teks yang diakhiri oleh baris baru , maka gema cukup. Jika ada sesuatu yang lebih pintar yang dimaksudkan, khususnya termasuk "garis parsial" yang tidak memiliki baris baru, maka printf adalah yang terbaik untuk tujuan itu .

Monty Harder
sumber
Bergantung pada echoimplementasinya, "menghindari baris baru" mudah dilakukan echo -n. Bahkan, -nadalah fitur gema yang paling portabel. Menurut POSIX, tidak ada di SystemV tetapi hadir di sebagian besar Unix.
terdon
Saya telah bekerja di beberapa kesatuan yang berbeda untuk tidak mencoba menghindari baris baru dengan gema. Menulis skrip yang portabel di SCO, AIX, HP-UX, dan Linux adalah ... menantang.
Monty Harder
Oh, tentu saja, tidak ada argumen di sana. Yang saya katakan hanyalah baris baru adalah yang paling tidak bermasalah. Semua taruhan dimatikan segera setelah Anda mencoba untuk port ke sistem non-GNU. Saya pikir Anda dapat mengandalkan -nuntuk BSD dan SystemV tetapi hal lain, saya tidak tahu.
terdon