จุดเด่นของ Shell Scripting เมื่อเทียบกับ Python [ปิด]


95

ฉันพยายามเรียนรู้การเขียนสคริปต์เชลล์ (ทุบตี) สองสามครั้ง แต่ไวยากรณ์ถูกผลักดันออกไป จากนั้นฉันก็พบ Python และสามารถทำสิ่งต่างๆเกือบทั้งหมดที่เชลล์สคริปต์ทำได้ใน Python ตอนนี้ฉันไม่แน่ใจว่าควรลงทุนเวลาในการเรียนรู้เชลล์สคริปต์อีกต่อไปหรือไม่ เลยอยากถามว่า

อะไรคือจุดแข็งของเชลล์สคริปต์ที่ทำให้เป็นเครื่องมือที่ขาดไม่ได้เมื่อเทียบกับ Python

ฉันไม่ได้ดูแลระบบตามอาชีพ แต่ฉันสนใจที่จะตั้งค่าระบบ Linux สำหรับผู้ใช้ตามบ้านดังนั้นฉันคิดว่าการเรียนรู้เชลล์สคริปต์อาจเป็นสิ่งที่จำเป็น

คำตอบ:


83
  • เชลล์สคริปต์มีสัญลักษณ์ที่ง่ายกว่าสำหรับการเปลี่ยนเส้นทาง I / O
  • ง่ายกว่าในการสร้างไปป์ไลน์จากโปรแกรมที่มีอยู่ในเชลล์
  • เชลล์สคริปต์ใช้ซ้ำทั้งโปรแกรม
  • Shell มีให้ใช้งานได้ทั่วไป (ในทุกอย่างเช่น Unix) - ไม่จำเป็นต้องติดตั้ง Python

'เป็นเรื่องจริงที่คุณสามารถทำทุกอย่างใน Python ที่คุณสามารถทำได้ในเชลล์ นอกจากนี้ยังเป็นความจริงที่ว่ามีสิ่งที่ง่ายใน Python ที่มีเปลือกแข็ง (เช่นเดียวกับที่มีสิ่งที่ง่ายในเปลือก แต่ยากใน Python) การรู้ทั้งสองอย่างจะดีที่สุดในระยะยาว


17
1 และ 2 คะแนนดี # 3 เป็นจุดอ่อนเนื่องจากนำไปสู่ค่าใช้จ่ายจำนวนมากที่ Python สามารถหลีกเลี่ยงได้ # 4 อาจไม่เป็นความจริงส่วนใหญ่ Python เป็นส่วนหนึ่งของ distros Linux ส่วนใหญ่ในตอนนี้
ล็อต

1
@Svante: เขียนเชลล์ลูปแบบธรรมดาเพื่อดำเนินการหลายอย่างโดยใช้คำสั่งเช่น "test" และ "expr" และเปรียบเทียบเวลาในการรันกับสคริปต์ Python ที่ใช้โมดูล "os" คำสั่งเช่น test และ expr มักเกี่ยวข้องกับการบังคับให้กระบวนการย่อยทำงานจริง
ล็อต

2
ฉันเห็นจุดที่ 3 เป็นข้อได้เปรียบอย่างมากไม่ใช่ข้อเสีย ตัวอย่างเช่นพิจารณาปรับขนาดไดเร็กทอรีที่เต็มไปด้วยรูปภาพด้วยโปรแกรมแปลง
Glenn

7
สิ่งที่น่าสังเกตอีกอย่างเกี่ยวกับ # 4 คือbashเชลล์โดยเฉพาะนั้นไม่สามารถใช้งานได้ทั่วไปใน linux distros ทั้งหมดโดยเฉพาะอย่างยิ่งสำหรับระบบฝังตัวและอื่น ๆ ที่รันbusyboxไฟล์ปฏิบัติการ สคริปซึ่งมีเป้าหมายบอร์นเปลือกตัวเองด้วยซึ่งbashจะย้อนกลับเข้ากันได้จะทำงานในทุกระบบ POSIX สอดคล้องอย่างไรว่าภาษาเป็นหนึ่งที่ถูก จำกัด bashมากขึ้นกว่าที่ดำเนินการโดย
สังหรณ์ใจใน

5
@intuited: eval "$ (history 2 | head -1 | perl -pe 's / (? <= which is) more could / at least /')"; ประวัติ -d $ (ประวัติ 2 | หัว -1 | sed 's / ^ \ s * ([0-9] \ +) / \ 1 /')
สัญชาตญาณ

54

"อะไรคือจุดแข็งของเชลล์สคริปต์ที่ทำให้เป็นเครื่องมือที่ขาดไม่ได้เมื่อเทียบกับ Python"

เปลือกขาดไม่ได้ ทำไมคุณถึงคิดว่ามีจำนวนมาก? bash, tcsh, csh, sh ฯลฯ ฯลฯ

Python เป็นเชลล์ ไม่ใช่สิ่งที่คุณจะใช้สำหรับการทำงานทั้งหมดคำสั่งที่คำสั่งแต่สำหรับการเขียนสคริปต์ก็เหมาะอย่างยิ่ง

Python เป็นส่วนมาตรฐานไม่มากก็น้อยของ Linux distro ทั้งหมด

ยิ่งหอยแบบเดิม ๆ ทำหลายอย่างมากเกินไป

  1. มีอินเทอร์เฟซผู้ใช้ที่สะดวกสำหรับการรันคำสั่ง ซึ่งรวมถึงคำสั่งบรรทัดเดียวที่เชลล์ค้นหา PATH ของคุณส้อมและรันโปรแกรมที่ร้องขอ นอกจากนี้ยังมีท่อลำดับและโปรแกรมพร้อมกัน (โดยใช้;, |และ&) เช่นเดียวกับการเปลี่ยนเส้นทางบาง (ใช้>และ<)

  2. พวกเขามีความสามารถในการเขียนโปรแกรมภาษาเหมือนโปรแกรมเล็กน้อยสำหรับการเรียกใช้สคริปต์ ภาษานี้ค่อนข้างใช้ยากและไม่มีประสิทธิภาพมาก ข้อความส่วนใหญ่ในภาษานี้ต้องใช้กระบวนการเพิ่มเติมอย่างน้อยหนึ่งกระบวนการเสียเวลาและหน่วยความจำ

เรียกใช้โปรแกรมจากเชลล์เปลี่ยนเส้นทาง stderr ไปยังล็อกไฟล์และสิ่งนั้นเป็นสิ่งที่ดี ทำสิ่งนั้นในเปลือก

เกือบทุกอย่างสามารถทำได้อย่างมีประสิทธิภาพและชัดเจนยิ่งขึ้นเช่นเดียวกับสคริปต์ Python

คุณต้องการทั้งสองอย่าง อย่างไรก็ตามคุณไม่ควรเขียนสคริปต์ด้วย if-statement หรือ loops ในภาษาเชลล์แบบเดิม


1
@intuited. ก) การเพิ่มจำนวนของเปลือกหอยที่แตกต่างกันแสดงให้เห็นถึงจำนวนของคุณสมบัติที่รวมกันเป็น "เปลือก"; ไม่ใช่บทบาทสำคัญ แต่เป็นสิ่งที่จับได้ทั้งหมดสำหรับคุณสมบัติ B) ตัวแปล python เป็น unix shell ที่เหมาะสมโดยใช้ #! C) ifคำสั่งเชลล์ "ธรรมดา" มักเกี่ยวข้องกับการเรียกใช้testโปรแกรม เชลล์เป็นภาษาโปรแกรม crummy ทุกประการ
ล็อตต์

4
@ ส. Lott: ดูเหมือนว่าความไม่สอดคล้องกันทางความหมายบางอย่างอยู่ในวงจรที่นี่ คำจำกัดความของฉันเกี่ยวกับ UNIX shell คือล่ามที่ภาษาส่วนใหญ่มุ่งเน้นไปที่การควบคุมการทำงานของระบบ UNIX ในระดับสูง ตามคำจำกัดความนี้เชลล์ของบางประเภทมีความจำเป็นอย่างยิ่งต่อการทำงานของระบบ UNIX และ Python ไม่มีคุณสมบัติ คุณจะกำหนดคำศัพท์นั้นอย่างไร?
สังหรณ์ใจ

1
@ S.Lott: ฉันไม่ใช่แฟนตัวยงของไวยากรณ์ที่ใช้ในเชลล์สคริปต์แบบดั้งเดิม แต่ฉันพบว่ามันค่อนข้างใช้งานได้และเหมาะสมในหลาย ๆ สถานการณ์โดยเป้าหมายหลักคือการควบคุมกระบวนการและการไหลของผลลัพธ์ สิ่งนี้มักต้องมีการตัดสินใจและการทำซ้ำ เปลือกหอยสมัยใหม่ ( bashอย่างน้อย) มีโครงสร้างในตัวเพื่อจัดการกับการตัดสินใจ (เช่นtestมีในbashตัวนอกเหนือจากโครงสร้างที่หลากหลายกว่า) แน่นอนว่ามันมีจุดอ่อน แต่ก็มีจุดแข็งด้วย นอกจากนี้ยังควรค่าแก่การเรียนรู้ในรายละเอียดเนื่องจากมีกระบวนทัศน์ที่แตกต่างจากภาษาประเภทอื่น ๆ
ปรีชา

1
@intuited: "พบว่าค่อนข้างใช้งานได้" เป็นการแสดงความยินดีกับทักษะของคุณไม่ใช่ภาษาที่หยาบคาย Python สามารถใช้งานได้มากขึ้นโดยผู้ที่ไม่ชำนาญ
ล็อตต์

3
@ เอสล็อตต์: น่าสนใจคุณมีปรัชญาที่แตกต่างจากฉันมากฉันรู้สึกว่าการออกแบบและการดำเนินงานเป็นเพียงไก่และไข่ นี่คือการบอกว่าเชลล์สคริปต์คือโปรแกรมที่รันโปรแกรม โปรแกรมเหล่านี้จำนวนมากถูกนำไปใช้ในตอนแรกเป็นเชลล์สคริปต์ที่ซับซ้อนมากขึ้น เมื่อถึงจุดหนึ่งมันก็คุ้มค่าอาจจะมากพอ ๆ กับประสิทธิภาพของโมดูลาร์สำหรับบางส่วนที่จะเขียนใหม่ใน C และในภายหลัง Python ตัวอย่างเช่นในบางจุดกำเนิดcat "$1" | ssh "$2" "cat - >\"$1\"" scpพวกเขารู้วิธีที่ดีที่สุดในการออกแบบเพราะพวกเขาใช้มันอยู่แล้ว
สังหรณ์ใจ

32

เปลือกทำให้การกระทำทั่วไปและเรียบง่ายเป็นเรื่องง่ายโดยมีค่าใช้จ่ายในการทำสิ่งที่ซับซ้อนให้ซับซ้อนมากขึ้น

โดยปกติเชลล์สคริปต์ขนาดเล็กจะสั้นและเรียบง่ายกว่าโปรแกรม python ที่เกี่ยวข้อง แต่โปรแกรม python มักจะยอมรับการปรับเปลี่ยนอย่างสง่างามในขณะที่เชลล์สคริปต์มีแนวโน้มที่จะได้รับการบำรุงรักษาน้อยลงและน้อยลงเมื่อมีการเพิ่มโค้ด

สิ่งนี้มีผลที่ตามมาเพื่อให้ได้ผลผลิตที่ดีที่สุดในแต่ละวันคุณต้องมีเชลล์สคริปต์ แต่คุณควรใช้มันเป็นส่วนใหญ่สำหรับสคริปต์ที่ถูกทิ้งและใช้ python ในที่อื่น


14

ไม่มีอะไรที่คุณสามารถทำได้กับเชลล์สคริปต์ที่คุณไม่สามารถทำได้กับ python ข้อได้เปรียบที่สำคัญของเชลล์สคริปต์คือคุณใช้คำสั่งเดียวกับที่คุณทำเมื่อคุณใช้เชลล์ดังนั้นหากคุณเป็นผู้ใช้เชลล์จำนวนมากการเขียนสคริปต์เชลล์จะกลายเป็นวิธีที่ง่ายและรวดเร็วในการทำให้งานเชลล์ของคุณเป็นไปโดยอัตโนมัติ .

ฉันยังพบว่ามันง่ายกว่าที่จะจัดการกับท่อข้อมูลในเชลล์สคริปต์มากกว่าใน python แม้ว่ามันจะทำได้จาก python ก็ตาม

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

แต่แล้วอีกครั้งสคริปต์ Python สามารถดูแลรักษาได้มากกว่าฉันพยายามย้ายจากเชลล์สคริปต์ที่น่าเกลียดขนาดใหญ่ไปยังสคริปต์ Python ด้วยเหตุผลนั้น นอกจากนี้ยังง่ายกว่าในการจัดการข้อยกเว้นและ QA ด้วย Python


9

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

โปรแกรมเมอร์ส่วนใหญ่พบว่าการเรียนรู้ภาษาใหม่ ๆ จะง่ายขึ้นเรื่อย ๆ ในแต่ละครั้ง (เช่นเดียวกันกับภาษาธรรมชาติเป็นส่วนใหญ่ด้วย) และยิ่งคุณเริ่มเร็วเท่าไหร่ก็ยิ่งดี

บวก: การเรียนรู้ภาษาจะช่วยให้คุณสามารถขจัดข้อ จำกัด จากความรู้และความคุ้นเคยที่สมบูรณ์ได้อย่างฟุ่มเฟือย สิ่งนี้อาจจะไม่ทำให้คุณรู้สึกผ่อนคลาย แต่อาจทำให้คุณได้รับเบียร์จากคนรอบข้าง!


8

ฉันเห็นด้วยกับคำตอบส่วนใหญ่ก่อนหน้านี้ ฉันคิดว่าคำสั่งเชลล์เหมาะสมที่สุดในการทำงานที่เน้นระบบไฟล์ (คัดลอกและย้ายไฟล์ grep ฯลฯ ) ในความคิดของฉันเชลล์ดีกว่าถ้าคุณต้องอ่านและเขียนลงไฟล์เนื่องจากการ>>file.txtเปลี่ยนเส้นทางครั้งเดียวจะผนวกเข้ากับไฟล์ทันทีแทนที่จะต้องพูดว่าfile=open('file.txt','a'); file.write()ฯลฯ

ในตอนนี้สำหรับการใช้งานส่วนตัวของฉันฉันผสมทั้งสองอย่างสร้างสคริปต์ python และเรียก os.system ('command') หรือ os.popen ('command') ทุกครั้งที่การกระทำบางอย่างในเชลล์ง่ายกว่าใน python


6

เปลือกมีอยู่ทุกที่ หากคุณยึดติดกับชุดฟังก์ชันพกพาที่ค่อนข้างพื้นฐานสคริปต์ของคุณสามารถทำงานบนโทรศัพท์มือถือเราเตอร์ไร้สาย DVR เน็ตบุ๊กเวิร์กสเตชันเซิร์ฟเวอร์เหล็กขนาดใหญ่และอื่น ๆ Python ไม่จำเป็นต้องรวมอยู่นอกกรอบในระบบจำนวนมากและอาจติดตั้งได้ยากขึ้นอยู่กับสภาพแวดล้อม

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

เปลือกยังมีคุณสมบัติที่ทรงพลัง ไปป์ไลน์เป็นโครงสร้างควบคุมที่น่าสนใจจริงๆซึ่งมีอยู่ในเปลือกเท่านั้นเท่าที่ฉันรู้


5

สิ่งที่ควรพิจารณาอีกประการหนึ่งเมื่อเลือกเชลล์สคริปต์ของ Python คือเวอร์ชัน Python ที่จะทำงานบนเครื่องเป้าหมาย RHEL5 (เพื่อชื่อหนึ่ง) กำลังจะเกิดขึ้นเป็นเวลานาน RHEL5 ติดอยู่กับ Python 2.4 มีไลบรารีที่ดีมากมายที่ขึ้นอยู่กับฟังก์ชันการทำงานที่เพิ่มใน Python post-2.4

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