ข้อไหนคือพกพาที่สุดของ sed, awk, perl และ sh?


15

ใครสามารถใส่เครื่องมือเหล่านี้ตามลำดับของการพกพา? ซึ่งเหล่านี้เป็นบางอย่างที่จะพบในได้มากที่สุดที่น้อยที่สุด * ระบบระวัง? เป็นของพวกเขา 100% แน่ใจว่าจะนำเสนอ? ฉันเดาว่าลำดับต่อไปนี้คือ:

  1. awk
  2. sed
  3. ดวลจุดโทษ
  4. Perl

ในขณะที่ฉันจินตนาการว่ามีระบบที่ไม่เริ่มต้นเชลล์ bourne บางเชลล์จะปรากฏเป็นค่าเริ่มต้นที่จะอยู่ที่/bin/sh? ไม่น่าจะเป็นไปได้ว่ามันไม่ใช่เปลือกหอยชนิด Bourne ทั้งสองawkและsedมีหน้าอธิบายพวกเขาในสเปค POSIX ดังนั้นสันนิษฐานว่าพวกเขาจะมีอยู่เสมอ เป็นอย่างนั้นเหรอ? ฉันมั่นใจได้หรือไม่ว่าทั้งสองจะถูกติดตั้งบน * nix ใด ๆ ? รวมถึงระบบฝังตัว?


ระบบฝังตัวมักจะเสียสละพกพาให้อยู่น้อยที่สุด หลายคนไม่ได้มาตรฐาน POSIX
jordanm

@jordanm หมายความว่าพวกเขาอาจไม่มีสิ่งเหล่านี้หรือเปล่า? ฉันสมมติว่าระบบที่มีอินเตอร์เฟสเชลล์อย่างน้อยที่สุด ฉันรู้ว่า busybox ที่ให้sh, awkและsedตัวอย่างของฉันและ NAS busybox-based นอกจากนี้ยังมี Perl
terdon

1
คุณอาจมีพวกเขา แต่สิ่งที่พวกเขาทำจะแตกต่างกันไปตามระบบดังนั้นคำถามจึงไม่สมเหตุสมผลตามที่ระบุไว้
Stéphane Chazelas

@StephaneChazelas อ่าคุณช่วยฉัน จำกัด ให้แคบลงได้ไหม? เป็นไปไม่ได้ที่จะจัดเรียงสิ่งเหล่านี้ในแง่ของความเป็นไปได้ที่จะพบได้ในระบบ X ประสบการณ์ของฉันคือ Linux อย่างเข้มงวดและระบบ NAS ที่ฝังอยู่สองตัว ฉันรู้ว่าคุณจะไม่ได้รับ GNU / Linux หากไม่มีสิ่งเหล่านี้ทั้งหมด 4 แต่คุณไม่สามารถให้ฉันคิดว่าพวกเขาที่ปลอดภัยที่สุดที่จะคิดว่าจะมีอยู่หรือไม่
terdon

คำตอบ:


15

ข้อไหนคือพกพาที่สุดของ sed, awk, perl และ sh?

sed, shและawkเป็นแบบพกพาถูกระบุโดย POSIX, perlไม่เป็นที่ไม่ได้รับการสนับสนุนจากมาตรฐาน

ใครสามารถใส่เครื่องมือเหล่านี้ตามลำดับของการพกพา?

หากคุณติดกับรหัสที่สอดคล้องกันไม่ควรมีคำสั่งในการพกพาสำหรับคำสั่ง POSIX สามคำ

สิ่งใดบ้างที่สามารถพบได้ในระบบ * nix ที่น้อยที่สุด

POSIX สามตัวพร้อมกับยูทิลิตี้อื่น ๆ เป็นสิ่งจำเป็นสำหรับระบบปฏิบัติการที่จะ POSIX ระบบปฏิบัติการที่ขาดบางส่วนของพวกเขาเนื่องจากการลดลงหรือให้การใช้งานที่ไม่สมบูรณ์ / ไม่สอดคล้องตามที่มีอยู่แม้ว่า

ที่จริงแล้ว Unix ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ฟรีและโอเพ่นซอร์สเช่นระบบปฏิบัติการอาจไม่ผ่านกระบวนการที่สอดคล้องกันหากพวกเขาพยายามและพวกเขาไม่เคยลองเลย

เป็นของพวกเขา 100% แน่ใจว่าจะนำเสนอ?

ฉันจะแปลกใจที่พบว่า * เหมือนระบบปฏิบัติการที่ไม่มีเชลล์ตามไวยากรณ์ของ Bourne แต่มีอะไรที่เป็นไปได้โดยเฉพาะอย่างยิ่งกับระบบฝังตัว

ฉันเดาว่าคำสั่งซื้อมีดังต่อไปนี้: เชลล์บางอันจะปรากฏเป็นค่าเริ่มต้นซึ่งจะเป็นที่ / bin / sh เสมอหรือไม่

/bin/shมีแนวโน้มที่จะเป็นเชลล์ตระกูลไวยากรณ์ของ Bourne แต่ไม่รับประกันว่าจะเข้ากันได้กับ POSIX แม้กระทั่งระบบที่เข้ากันได้กับ POSIX ตัวอย่างเช่นอยู่/usr/xpg4/bin/shใน Solaris 10 และเก่ากว่าในขณะ/bin/shที่เชลล์ Bourne ดั้งเดิมดั้งเดิมซึ่งไม่ใช่ POSIX


12

ใช้คิวจาก Autotools: การติดตัวหารร่วมที่ต่ำสุดของบอร์นและ POSIX เชลล์ - อาจจะเติมโดยsed- ถ้าคุณต้องเขียนอะไรบางอย่างที่จะต้องทำงานได้ทุกที่ อาจมีระบบที่มีบางสิ่งผิดปกติ แต่คุณสามารถแก้ไขปัญหาดังกล่าวได้ด้วยการเขียนใหม่

ตัวอย่างเช่นระบบโบราณบางอย่างมีปัญหาเกี่ยวกับข้อผิดพลาดในการขยายtestหรือที่รู้จัก[:

 if [ $foo = bar ] ; then...

ดังนั้นการฝึก Autoconf คือการเขียนมันซ้ำในเครื่องหมายคำพูดคู่ด้วยคำนำหน้าอักขระเดียวเช่น:

 if [ x"$foo" = "xbar" ] ; then...

คุณสามารถใช้"x$foo"ที่นี่ได้ สิ่งนี้ป้องกันความเป็นไปได้ที่$fooอาจเป็นตัวเลือกที่ถูกต้องtest(1)และเนื่องจาก[เป็นนามแฝงสำหรับtestมันจึงอาจตีความการแสดงออกที่ผิด การแก้ปัญหาคือการตั้งค่าสถานการณ์ที่โต้แย้งไม่รู้จัก[มักจะเริ่มต้นด้วยซึ่งหมายความว่ามันไม่สามารถมีความหมายพิเศษเพื่อx[

(Autoconf แนะนำให้ใช้testแทน[แต่คำแนะนำนั้นเป็นปฏิกิริยาต่อความขัดแย้งที่อาจเกิดขึ้นกับM4ซึ่งใช้[ในไวยากรณ์ของมันด้วย)

awk เป็น POSIXดังนั้นในทางทฤษฎีมันสามารถใช้ได้ทุกที่ มันยังอยู่ใน Busyboxดังนั้นคุณจะมีawkการนำไปใช้แม้ในระบบ Linux ที่ฝังอยู่อย่างเข้มงวด ยังคงฉันต้องการจะประหลาดใจไม่น้อยที่จะเจอระบบได้โดยไม่ต้องกว่าawk sedฉันคิดว่ามันมีความซับซ้อน: เครื่องมือที่ง่ายกว่ามีแนวโน้มที่จะอยู่รอดในการทดลองที่รุนแรง

Perl ไม่ได้เป็นส่วนหนึ่งของมาตรฐานที่แพร่หลาย POSIX หรืออย่างอื่นดังนั้นคุณจึงไม่สามารถนับได้หากคุณไม่ทราบล่วงหน้าเกี่ยวกับสภาพแวดล้อมเป้าหมาย Perl ไม่ได้ติดตั้งโดยค่าเริ่มต้นใน:

  • Cygwin
  • FreeBSD และ NetBSD
  • "น้อยที่สุด" ติดตั้งสำหรับ Linuxes บางตัวรวมถึง Slackware
  • ลินุกซ์ในตัวหลายตัวที่ใช้งาน Busybox เป็นหลักสำหรับ userland

คู่มือ Autoconf มีบทเกี่ยวกับการเขียนโปรแกรมเชลล์แบบพกพาซึ่งจะเป็นประโยชน์กับคุณ เครื่องมือที่ใช้ในส่วนสุดท้ายครอบคลุมชอบsed, awkและอื่น ๆ อีกมากมาย


ขอบคุณ แต่ฉันสงสัยเกี่ยวกับลำดับการพกพาของสิ่งเหล่านี้ ถ้าฉันอ่านถูกต้องคุณกำลังแนะนำสิ่งนั้นshและsedพกพาได้มากที่สุด ตกลงสิ่งอื่น ๆ ? และเป็นshแบบพกพาที่จริงเหรอ? เกิดอะไรขึ้นถ้าเชลล์เริ่มต้นเป็นอนุพันธ์ C-shell? ระบบดังกล่าวจะยังมี symlink ที่/bin/shหรือไม่
terdon

ขอบคุณสำหรับการแก้ไขนั่นคือสิ่งที่ทั้งสองsedและawkมีให้โดย busybox ทำไมคุณจะแปลกใจที่พบว่าsedขาดหายไปมากขึ้น? คุณมีความคิดใด ๆ ไหมถ้ามีตัวเลือกอื่น ๆ ในช่องว่างเช่นกัน
terdon

Re: POSIX vs Bourne shell , เขียนคำแนะนำใหม่เพื่อยึดจอ LCD ของทั้งสอง Re: การอ้างถึงการทดสอบฉัน misremember สาเหตุของมัน แต่พบบทในคู่มือ Autoconf ที่เหตุผลครอบคลุมและแก้ไขคำตอบตาม Re: sed vs awk และ Busyboxฉันอธิบายว่า: ความซับซ้อนและ triage ที่มากขึ้น sedทำน้อยกว่าดังนั้นไบนารีจะมีขนาดเล็กลงดังนั้นจึงมีเหตุผลน้อยกว่าที่จะลบออกawkซึ่งมีความซับซ้อนพอสมควร (20 kiB เทียบกับ 48 kiB ในระบบของฉัน) Re: ทางเลือกไม่ว่างฉันไม่ทราบถึงทางเลือกอื่นในการช็อปปิ้งแบบครบวงจร
Warren Young

+1 เพราะฉันเห็นด้วยกับสถานที่ตั้งทั่วไปของคุณที่นี่ (ว่าตัวหารร่วมที่ต่ำที่สุดจะเป็นอะไรsh- แปลกที่ terdon จัดอันดับawkและsedอยู่เหนือ o_O นี้หรือไม่) แม้ว่านี่จะเป็นเรื่องบังเอิญกับวัตถุประสงค์ของ Autotool เนื่องจากสภาพแวดล้อมบางอย่าง อาจไม่ได้มีไว้สำหรับอาคารระยะเวลา
goldilocks

1
@WarrenYoung นั่นเป็นสิ่งที่ฉันสงสัย ฉันไม่รู้ว่าระบบ * nix ทั้งหมดจะติดตั้งเชลล์ bourne ตามค่าเริ่มต้นหรือไม่ หากพวกเขาทั้งหมดมี/bin/shสิ่งต่าง ๆ แต่ฉันไม่รู้ว่าจะมี ขออภัยที่ไม่ยอมรับสิ่งนี้โดยเด็ดขาดฉันถูกฉีกระหว่างคำตอบของคุณกับ jlliagre ซึ่งทั้งคู่ตอบคำถามของฉัน ฉันเลือกเขาเพราะมันพูดโดยตรงมากกว่าและเพราะเขามีตัวแทนน้อยกว่า :)
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.