printf หรือ echo ไหนดีกว่า


16

สำหรับการแสดงข้อความและข้อมูลการพิมพ์มีสองคำสั่งที่มีอยู่และ printf แล้วพวกเขาใช้ต่างกันอย่างไร ข้อไหนดีกว่ากัน?echo


8
คุณจะพบคำตอบได้ที่นี่: unix.stackexchange.com/a/65819
user218740

คำตอบ:


27

ดีกว่าและใช้กันอย่างแพร่หลายไม่เหมือนกัน ในขณะที่printfดีกว่าด้วยเหตุผลหลายประการคนส่วนใหญ่ยังคงใช้echoเพราะไวยากรณ์ง่ายขึ้น

สาเหตุหลักที่คุณควรเลือกprintfคือ:

  1. echo ไม่ได้มาตรฐานมันจะทำงานแตกต่างกันในระบบที่แตกต่างกัน
  2. echo fooมันเป็นเรื่องยากที่จะคาดการณ์สิ่งที่คุณกำลังใช้งานจริงเมื่อคุณ เพื่ออธิบายในระบบ Debian ของฉัน:

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

    อย่างที่คุณเห็นมีสองechoคำสั่งต่างๆ หนึ่งคือเชลล์ (ทุบตีในกรณีนี้) builtin และอีกคำสั่งเป็นไบนารีแยกต่างหาก โปรดทราบว่าbashมีprintfbuiltin แต่พฤติกรรมของมันเป็นมาตรฐานมากขึ้นดังนั้นจึงเป็นปัญหาน้อยลง (ขอบคุณ @ RaduRădeanuสำหรับการชี้ให้เห็น)

  3. เนื่องจากบาง ( แต่ไม่ใช่ทั้งหมด) การใช้งานของสวิทช์การสนับสนุนบรรทัดคำสั่งมันเป็นเรื่องยากที่จะพิมพ์สตริงที่เริ่มต้นด้วยecho -ในขณะที่หลายโปรแกรมสนับสนุน--เพื่อบ่งบอกถึงจุดสิ้นสุดของสวิตช์และจุดเริ่มต้นของการขัดแย้ง (ตัวอย่างเช่นgrep -- -a fileจะค้นหาบรรทัดในfileที่มี-a) echoไม่ได้ ดังนั้นคุณจะechoพิมพ์-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 สามารถทำได้อย่างง่ายดาย:

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

สำหรับข้อมูลเพิ่มเติมกว่าที่คุณต้องการทราบว่าทำไมprintfดีกว่าechoดูคำตอบของคำถามที่คล้ายกันนี้ในhttp://unix.stackexchange.com :

/unix//a/65819/22222


1
ได้รับคำตอบที่ดี มันช่วยให้ฉันชอบprintfล่ามที่ดีกว่า
Pandya

3
ณ จุดที่ 2: สิ่งเดียวกันนั้นเป็นจริงสำหรับprintf(ดูtype -a)
Radu Rădeanu

2
@ RaduRădeanuจริง แต่printfมีการกำหนดไว้อย่างเข้มงวดมากขึ้นใน POSIX และฉันคิดว่า builtin เป็นไปตามมาตรฐานเดียวกัน ข้อมูลจำเพาะ POSIX สำหรับechoในอีกทางหนึ่งมีความเข้มงวดน้อยกว่าและระบุอย่างชัดเจนว่าจะมีความแตกต่างระหว่างการนำไปใช้งานและprintfควรเป็นที่ต้องการ
terdon

ว้าว. ดังนั้นจึงมีตัวอักษรศูนย์เปรียบทางด้านเทคนิควัตถุประสงค์ที่จะใช้ echoถูกต้องหรือไม่
JamesTheAwesomeDude

1
@ JamesTheAwesomeDude ไม่อย่างแน่นอนไม่มีข้อได้เปรียบทางเทคนิคใด ๆ เหตุผลเดียวที่จะใช้echoมากกว่าprintfนั้นก็คือ forma นั้นง่ายกว่า ถ้าคุณรู้ว่าสิ่งที่คุณกำลังพิมพ์ได้เร็วขึ้นและง่ายต่อการพิมพ์กว่าecho foo นอกเหนือจากที่เมื่อเขียนสคริปต์ที่ความต้องการของตัวแปรที่จะพิมพ์ไม่เคยมีเหตุผลที่ดีที่จะใช้printf 'foo\n' echo
terdon

4

การถามว่าข้อไหนดีกว่าตัวเองไม่สมบูรณ์

หากทุกคนปรารถนาที่จะทำคือปล่อยข้อความอย่างน้อยหนึ่งบรรทัดโดยยกเลิกการขึ้นบรรทัดใหม่แล้วสะท้อนพอเพียง หากมีจุดประสงค์ที่ฉลาดกว่านี้รวมถึง "บางส่วนของบรรทัด" ที่ไม่มีการขึ้นบรรทัดใหม่ printf นั้นเหมาะสมที่สุดสำหรับวัตถุประสงค์นั้น


ทั้งนี้ขึ้นอยู่กับechoการดำเนินการ "หลีกเลี่ยงการขึ้นบรรทัดใหม่" echo -nจะทำได้อย่างง่ายดายด้วย ในความเป็นจริง-nเป็นคุณสมบัติพกพามากที่สุดของเสียงสะท้อน ตาม POSIX มันหายไปจาก SystemV แต่มีอยู่ใน Unices ส่วนใหญ่
terdon

ฉันได้ทำงานกับยูนิโค้ดที่แตกต่างกันมากพอที่จะไม่ลองเลี่ยงการขึ้นบรรทัดใหม่ด้วยเสียงก้อง การเขียนสคริปต์ที่สามารถพกพาข้าม SCO, AIX, HP-UX และ Linux เป็นสิ่งที่ท้าทาย
Monty Harder

โอ้ไม่มีข้อโต้แย้งเลย ทั้งหมดที่ฉันพูดคือการขึ้นบรรทัดใหม่เป็นปัญหาที่น้อยที่สุด การเดิมพันทั้งหมดจะปิดลงทันทีที่คุณพยายามพอร์ตไปยังระบบที่ไม่ใช่ของ GNU ฉันคิดว่าคุณสามารถพึ่งพา-nBSDs และ SystemV แต่อย่างอื่นฉันไม่มีความคิด
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.