สำหรับการแสดงข้อความและข้อมูลการพิมพ์มีสองคำสั่งที่มีอยู่และ
printf แล้วพวกเขาใช้ต่างกันอย่างไร ข้อไหนดีกว่ากัน?echo
สำหรับการแสดงข้อความและข้อมูลการพิมพ์มีสองคำสั่งที่มีอยู่และ
printf แล้วพวกเขาใช้ต่างกันอย่างไร ข้อไหนดีกว่ากัน?echo
คำตอบ:
ดีกว่าและใช้กันอย่างแพร่หลายไม่เหมือนกัน ในขณะที่printfดีกว่าด้วยเหตุผลหลายประการคนส่วนใหญ่ยังคงใช้echoเพราะไวยากรณ์ง่ายขึ้น
สาเหตุหลักที่คุณควรเลือกprintfคือ:
echo ไม่ได้มาตรฐานมันจะทำงานแตกต่างกันในระบบที่แตกต่างกันecho fooมันเป็นเรื่องยากที่จะคาดการณ์สิ่งที่คุณกำลังใช้งานจริงเมื่อคุณ เพื่ออธิบายในระบบ Debian ของฉัน:
$ type -a echo
echo is a shell builtin
echo is /bin/echo
อย่างที่คุณเห็นมีสองechoคำสั่งต่างๆ หนึ่งคือเชลล์ (ทุบตีในกรณีนี้) builtin และอีกคำสั่งเป็นไบนารีแยกต่างหาก โปรดทราบว่าbashมีprintfbuiltin แต่พฤติกรรมของมันเป็นมาตรฐานมากขึ้นดังนั้นจึงเป็นปัญหาน้อยลง (ขอบคุณ @ RaduRădeanuสำหรับการชี้ให้เห็น)
เนื่องจากบาง ( แต่ไม่ใช่ทั้งหมด) การใช้งานของสวิทช์การสนับสนุนบรรทัดคำสั่งมันเป็นเรื่องยากที่จะพิมพ์สตริงที่เริ่มต้นด้วย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 :
printfล่ามที่ดีกว่า
printf(ดูtype -a)
echoถูกต้องหรือไม่
echoมากกว่าprintfนั้นก็คือ forma นั้นง่ายกว่า ถ้าคุณรู้ว่าสิ่งที่คุณกำลังพิมพ์ได้เร็วขึ้นและง่ายต่อการพิมพ์กว่าecho foo นอกเหนือจากที่เมื่อเขียนสคริปต์ที่ความต้องการของตัวแปรที่จะพิมพ์ไม่เคยมีเหตุผลที่ดีที่จะใช้printf 'foo\n' echo
การถามว่าข้อไหนดีกว่าตัวเองไม่สมบูรณ์
หากทุกคนปรารถนาที่จะทำคือปล่อยข้อความอย่างน้อยหนึ่งบรรทัดโดยยกเลิกการขึ้นบรรทัดใหม่แล้วสะท้อนพอเพียง หากมีจุดประสงค์ที่ฉลาดกว่านี้รวมถึง "บางส่วนของบรรทัด" ที่ไม่มีการขึ้นบรรทัดใหม่ printf นั้นเหมาะสมที่สุดสำหรับวัตถุประสงค์นั้น
echoการดำเนินการ "หลีกเลี่ยงการขึ้นบรรทัดใหม่" echo -nจะทำได้อย่างง่ายดายด้วย ในความเป็นจริง-nเป็นคุณสมบัติพกพามากที่สุดของเสียงสะท้อน ตาม POSIX มันหายไปจาก SystemV แต่มีอยู่ใน Unices ส่วนใหญ่
-nBSDs และ SystemV แต่อย่างอื่นฉันไม่มีความคิด