แผนภาพเวนน์ของ curl-wget
(daniel.haxx.se)wgetไม่ได้เป็นคู่แข่งโดยตรงของcurlแต่ควรมองว่าเป็น เครื่องมือที่มีความสามารถบางส่วนทับซ้อนกัน และสามารถใช้ร่วมกันได้ตามลักษณะงาน- เกณฑ์ในการเลือกไม่ใช่ความชอบต่อเครื่องมือ แต่คือ เหมาะกับการทำงานนั้นให้เสร็จมากกว่าหรือไม่ และถ้า
wgetเหมาะกว่า ก็ใช้wgetได้เลย - มีการสรุปความแตกต่างทางเทคนิคและส่วนที่ทับซ้อนกันของ
curlกับwgetแบบเห็นภาพใน แผนภาพเวนน์ และยังมีภาพความละเอียดเต็มให้ด้วย - ทั้งสองโปรเจ็กต์ไม่ได้อยู่ในความสัมพันธ์แบบเผชิญหน้ากัน โดยฝั่ง
curlเคยมีส่วนร่วมส่งโค้ดให้wgetและ ผู้ดูแลwgetหลายคนก็เคยมีส่วนร่วมกับcurlเช่นกัน - ข้อผิดพลาดหรือสิ่งที่ตกหล่นในแผนภาพสามารถอัปเดตได้ และยังมีเอกสารเปรียบเทียบแยกต่างหากกับตารางเปรียบเทียบเครื่องมือดาวน์โหลดให้ดูรายละเอียดเพิ่มเติม
เกณฑ์ในการมอง curl และ wget
wgetใกล้เคียงกับการเป็น เครื่องมือคู่กัน มากกว่าจะเป็นคู่แข่งของcurl- เครื่องมือทั้งสองมีฟีเจอร์บางส่วนที่ทับซ้อนกัน แต่ประเด็นสำคัญไม่ใช่การยึดติดกับเครื่องมือใดเครื่องมือหนึ่ง แต่คือการเลือกให้เหมาะกับ งานที่ต้องการแก้ไข
- หากในบางสถานการณ์
wgetเหมาะกับการทำงานนั้นให้เสร็จมากกว่า ก็เลือกใช้wgetจะดีกว่า
ความแตกต่างที่สรุปด้วยแผนภาพเวนน์
- มีการสร้างแผนภาพเวนน์เพื่อแสดงให้เห็น ความแตกต่างทางเทคนิค และความคล้ายคลึงกันบางส่วนระหว่าง
curlกับwgetในรูปแบบภาพ - สามารถคลิกที่ภาพแผนภาพเพื่อดูเวอร์ชันความละเอียดเต็มได้
- ผู้เขียนขอให้แจ้งหากพบปัญหาหรือรายการที่ตกหล่น และสามารถอัปเดตแผนภาพได้หากจำเป็น
ความร่วมมือระหว่างโปรเจ็กต์
- ฝั่ง
curlเคยมีส่วนร่วมส่งโค้ดให้wget - ผู้ดูแล
wgetหลายคนก็เคยมีส่วนร่วมกับcurl - ความสัมพันธ์ของทั้งสองโปรเจ็กต์ใกล้เคียงกับความร่วมมือ มากกว่าการแข่งขันหรือการเผชิญหน้า
แหล่งข้อมูลเปรียบเทียบเพิ่มเติม
- curl vs wget: เอกสารเปรียบเทียบ
curlกับwget - Compare curl with other download tools: ตารางเปรียบเทียบ
curlกับเครื่องมือดาวน์โหลดอื่น ๆ - OpenHub’s curl vs wget table: ตารางเปรียบเทียบ
curlกับwgetของ OpenHub
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ผมคิดว่าฝั่ง Wget อย่างน้อยควรใส่เรื่อง ค่าเริ่มต้นที่สมเหตุสมผล, การดาวน์โหลดต่อจากเดิม และการลองใหม่เมื่อเกิดข้อผิดพลาดไว้ด้วย
ช่วงหลังมานี้ผมต้องเขียนสคริปต์เพื่อดาวน์โหลดไฟล์ขนาดใหญ่มากผ่านการเชื่อมต่อที่ไม่เสถียร และความเข้าใจร่วมกันในหมู่วิศวกรคือ งานแบบนี้ควรใช้ Wget
ผมลองใช้ curl ด้วย แต่โดยค่าเริ่มต้นมันไม่ดาวน์โหลดต่อจากเดิมหรือ retry ให้ ต้องอ่านคู่มือแล้วระบุออปชันกับอาร์กิวเมนต์หลายอย่าง ผมรู้สึกว่าพฤติกรรมแบบนี้ควรเป็นค่าเริ่มต้น
สำหรับ Wget แค่ใช้ออปชัน
--continueตัวเดียวก็เปิดการดาวน์โหลดต่อได้ในทุกสถานการณ์ รวมถึงหลังโปรแกรมล่ม และในบทนำของคู่มือก็ระบุว่าออกแบบมาให้ทำงานทนทานบนเครือข่ายที่ช้าหรือไม่เสถียร หากดาวน์โหลดล้มเหลวก็จะพยายามใหม่ต่อไปจนกว่าจะได้ไฟล์ครบด้วย curl ก็น่าจะตั้งออปชันทั้งหมดให้ทำงานได้อย่างเชื่อถือได้บนการเชื่อมต่อแย่ ๆ ได้ แต่ Wget ดูเหมือนเปิดพฤติกรรมพื้นฐานเหล่านั้นไว้อยู่แล้ว ทำให้ผมเชื่อได้ว่ามันจะทำงานตามที่คาดในสถานการณ์ผิดพลาดที่ผมไม่ได้ทดสอบเอง แม้โปรโตคอล HTTP จะอัปเดต Wget เวอร์ชันใหม่ก็มีโอกาสรองรับเป็นค่าเริ่มต้น แต่ curl อาจต้องใช้สวิตช์ใหม่เพื่อเปิดพฤติกรรมที่ดีขึ้น และหลังปล่อยผลิตภัณฑ์ไปแล้วก็เพิ่มไม่ได้
สำหรับผม curl เป็น เครื่องมือระดับล่าง ที่ยอดเยี่ยมและอเนกประสงค์มาก และ CLI ของมันก็สะท้อนลักษณะนั้น แต่ในงานประจำวันผมชอบ Wget มากกว่า เพราะมันทำงานได้ดีกว่ามากตั้งแต่ค่าเริ่มต้น คู่มือก็ไล่อ่านได้เร็วกว่า อาจเพราะไม่ได้รองรับโปรโตคอลลึกลับทั้งหมดที่พูดถึงกันที่นี่
แค่
wget urlแล้วดาวน์โหลด URL มาเก็บได้ ก็ทำให้ Wget ชนะในการใช้งานบรรทัดคำสั่งแล้วในความเห็นผมcurlก็มีฟังก์ชันนั้นตรง ๆ เหมือนกัน การดาวน์โหลดต่อคือแฟล็ก-Cและการ retry คือ--retryโดยส่วนตัวผมรู้สึกว่าค่าเริ่มต้นของ curl ก็สมเหตุสมผลพอสมควร และสำหรับเครื่องมืออย่าง curl ผมไม่อยากให้ทั้งสองอย่างนั้นเปิดเป็นค่าเริ่มต้น
-iของ Wget ที่ให้อ่าน URL จากไฟล์ได้ด้วยโดยเฉพาะ
wget -i -มีประโยชน์มากใน pipeline เพราะมันอ่านจาก standard inputเท่าที่ผมรู้ curl ทำแบบนี้ไม่ได้ ปกติมักบอกให้ใช้
xargsแต่แบบนั้นต้องรอให้ URL มาครบทั้งหมดก่อนแล้วค่อยรัน curl ทำให้เสียความขนานระหว่างคำสั่งที่สร้าง URL กับคำสั่งดาวน์โหลด จึงยังไม่ค่อยเหมาะจะเป็นตัวทดแทนต่อให้เคยอ่านคู่มือมาแล้ว ก็ไม่ง่ายที่จะจำแฟล็กที่ต้องการได้เป๊ะ ๆ และโดยปกติการตรวจสอบคำสั่งที่ถูกสร้างขึ้นมาจะเหนื่อยน้อยกว่าการอ่านคู่มือแล้วประกอบคำสั่งเองตั้งแต่ต้น
บนเว็บยุคใหม่ บางครั้งใช้เครื่องมืออย่าง Puppeteer ในสคริปต์ที่เขียนเองยังง่ายกว่า โดยเฉพาะถ้าไซต์ที่ต้องโต้ตอบด้วยใช้ JavaScript หนักมาก
เช่น
$ curl -sSLOJ 'example.com/file name.txt'จะได้ข้อผิดพลาดcurl: (3) URL using bad/illegal format or missing URLและ$ curl -sSLOJ 'example.com/file%20name.txt'จะสร้างไฟล์ชื่อfile%20name.txtในขณะที่ wget จะสร้างไฟล์ชื่อ
"file name.txt"จาก URL ทั้งสองแบบโดยไม่ต้องมีแฟล็กเพิ่ม อย่างไรก็ตาม URL ตัวอย่างนี้เป็น 404 ดังนั้นถ้าจะพูดให้เคร่งครัดต้องใส่--content-on-errorให้ wget ด้วยสำหรับหลายคน ความต่างหลักน่าจะเป็น เครื่องมือที่เขียนลง standard output เป็นค่าเริ่มต้น กับ เครื่องมือที่สร้างไฟล์เป็นค่าเริ่มต้น
shได้ ;-)สำหรับผม ฟีเจอร์ชี้ขาดของ Wget คือมันดาวน์โหลดไฟล์โดยใช้ ชื่อไฟล์ที่อนุมานจาก URL เป็นค่าเริ่มต้น
ถ้ารัน
wget url://to/file.htmจะได้ไฟล์ชื่อ"file.htm"ในไดเรกทอรีทำงานปัจจุบันถ้าใช้ curl ต้องเขียนแบบ
curl url://to/file.htm > file.htmหรือใช้คำสั่งแบบอื่นที่สะดวกน้อยกว่าcurl -Ohttps://curl.se/docs/manpage.html#-O
wget "url://to/file.htm?uid=foo&q=bar&rnd=4"curl -Oสะดวกกว่าถ้าเทียบ “ฟีเจอร์ชี้ขาด” นั้นกับ
catก็เหมือนcat file.htmlถูกเปลี่ยนเป็นcat file.html > file.htmlแล้วเวลาที่อยากแค่พิมพ์ออกมา ไม่ใช่คัดลอกจริง ๆ ก็ต้องใช้ประมาณcat file.html -o -ดังนั้นผมดีใจที่ curl ไม่มีฟีเจอร์แบบนั้นDaniel Stenberg จัดอยู่ในกลุ่มนักพัฒนาที่หาได้ยากซึ่งทุ่มเท หัวใจและจิตวิญญาณ ให้กับผลงานของตัวเอง
ในบิ๊กเทคยุคใหม่ นักพัฒนาที่เหมือนเงาดูราวกับเป็นฟันเฟืองที่เปลี่ยนได้ของเครื่องจักรทำเงิน และคุณลักษณะแบบนี้ดูเหมือนกำลังหายไปเรื่อย ๆ
เขาดูเหมือนปฏิบัติต่อ curl ราวกับเป็นร่องรอยของตัวเองที่ทิ้งไว้ในโลก IT
แน่นอนว่าทุกวันนี้หลายครั้งมันดีกว่าในเชิงเทคนิคจริง ๆ ด้วย ทำให้เลือกง่ายขึ้น
การเปรียบเทียบนี้ดูจะเก่าไปนิด ตัวอย่างเช่น ในไดอะแกรมฝั่ง Wget ขาดสองอย่างด้านล่างนี้
HTTP PUTทำได้ด้วยwget --method=PUT --body-data=และพร็อกซีกับ HTTPS ก็ทำได้เช่นwget --use-proxy=on --https_proxy=[https://example.com](<https://example.com>)curl มีออปชันและความยืดหยุ่นมากกว่าอย่างสม่ำเสมอ แต่หลายรายการทางขวาของแผนภาพเวนน์นั้น Wget ก็ทำได้ในระดับหนึ่ง
ว้าว ไม่รู้เลยว่า curl รองรับ โปรโตคอล มากขนาดนี้ ถึงอย่างนั้น ส่วนทับซ้อนเล็ก ๆ นั้นก็น่าจะเป็นส่วนที่ผู้ใช้ curl/Wget มากกว่า 90% ใช้งานจริง
จากมุมมองนักพัฒนา พื้นที่ที่ซ้อนกันอาจไม่ได้ใหญ่มาก แต่จากมุมมองผู้ใช้ มันอาจดูใหญ่กว่ามาก
ส่วนที่ผมชอบที่สุดในบทความคือประโยคนี้
“ผมเคย contribute โค้ดให้ wget ผู้ดูแล wget หลายคนก็เคย contribute ให้ curl เราทุกคนเป็นเพื่อนกัน”
การเปรียบเทียบที่ Daniel Stenberg ทำไว้ก็เป็นสิ่งที่ควรอ่าน
https://daniel.haxx.se/docs/curl-vs-wget.html
เมื่อก่อนเวลาต้องการ mirror เว็บไซต์ ผมใช้ Wget เพราะ Wget เป็นเครื่องมือเฉพาะทาง
curl เป็นไลบรารีร้องขอแบบอเนกประสงค์ที่มี CLI frontend และยังถูกฝังในโปรแกรมอื่น หรือใช้เหมือน API ของไลบรารีมาตรฐานใน PHP เป็นต้น
การใช้งานที่พบบ่อยที่สุดน่าจะเป็นส่วนที่ทั้งสองทับซ้อนกัน ดังนั้นผมอยากเห็นแผนภาพเวนน์ที่แสดงว่าแต่ละเครื่องมือถูกติดตั้งมาเป็นค่าเริ่มต้นใน ระบบปฏิบัติการและ Docker image ใดบ้าง