สำหรับการแสดงข้อความและข้อมูลการพิมพ์มีสองคำสั่งที่มีอยู่และ
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
มีprintf
builtin แต่พฤติกรรมของมันเป็นมาตรฐานมากขึ้นดังนั้นจึงเป็นปัญหาน้อยลง (ขอบคุณ @ 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 ส่วนใหญ่
-n
BSDs และ SystemV แต่อย่างอื่นฉันไม่มีความคิด