เชลล์สคริปต์มีข้อได้เปรียบอะไรบ้างในการใช้ภาษาโปรแกรมแปลความหมาย [ปิด]


15

(ฉันไม่แน่ใจว่าเป็นคำถามที่เหมาะสมหรือไม่ที่นี่)

เชลล์สคริปต์เช่นเดียวกับที่เขียนไว้bashสามารถทำสิ่งต่างๆได้ พวกเขาสามารถเรียกโปรแกรม Unix, ไพพ์เอาท์พุท, เปลี่ยนเส้นทาง I / O จาก / ไปยังไฟล์, โฟลว์การควบคุม, ตรวจสอบว่ามีไฟล์อยู่หรือไม่ ฯลฯ

แต่ภาษาการเขียนโปรแกรมที่ทันสมัยเช่นpythonและrubyสามารถทำสิ่งเหล่านี้ได้ และพวกเขา (ฉันคิดว่า) อ่านได้ง่ายขึ้นและบำรุงรักษาได้มากขึ้น

bashสนุกกับการยอมรับอย่างกว้างขวาง แต่มีการแจกแจงจำนวนมากติดตั้งpythonล่ามเช่นกัน

ดังนั้นข้อดีของเชลล์สคริปต์คืออะไร ถ้าฉันสามารถเขียนpython, rubyหรือperlเป็นมูลค่าที่จะเรียนรู้bash?


3
หากคุณทำงานกับระบบ Unix ได้มากคุณควรเรียนรู้การทุบตีเช่นเดียวกับกระสุน Unix ยอดนิยมอื่น ๆ
เบอร์นาร์ด

คำตอบ:


30

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

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

ตัวอย่างเช่นที่นี่คือสคริปต์ทุบตีที่ย้ายไฟล์ PNG ทั้งหมดจากไดเรกทอรีปัจจุบันไปยังไดเรกทอรีที่ระบุ

#!/usr/bin/sh
mv *.png $1

นี่คือเวอร์ชั่น Python

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

คุณจะสังเกตเห็น:

  • สคริปต์ทุบตีคือหนึ่งในสามตราบเท่าที่ Python ถ้าคุณนับจำนวนบรรทัด (ยกเว้นบรรทัด Shebang) - ยิ่งน้อยลงตามจำนวนตัวอักษร
  • สคริปต์ Python ต้องการไลบรารีสามตัวที่จะนำเข้าในขณะที่ทุกสิ่งที่คุณต้องการสำหรับงานนี้จะมีให้ใช้แบบทุบตี
  • สคริปต์ Python ต้องการการวนซ้ำอย่างชัดเจนเพื่อย้ายไฟล์ในขณะที่เป็นส่วนหนึ่งของซีแมนทิกส์ของmvคำสั่งใน bash
  • สคริปต์ทุบตีสามารถทำงานได้เร็วขึ้น - คุณอาจจะเรียกใช้งานจากทุบตีและคุณสามารถใช้sourceเรียกใช้ในเชลล์อินสแตนซ์เดียวกัน
  • glob.iglob("./*.png") เป็นคำที่พูดออกมาได้ *.png

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

ในฐานะตัวอย่างโต้แย้งฉันต้องเขียนชุดคำสั่งที่ตรวจสอบเพื่อดูว่าชื่อไฟล์แต่ละรายการอยู่ในไดเรกทอรีหนึ่งนานแค่ไหน หากพวกเขาใช้เวลานานกว่าระบบปฏิบัติการที่รองรับพวกเขาจะต้องสั้นลง สิ่งนี้อาจส่งผลให้ชื่อไฟล์ซ้ำกันซึ่งฉันต้องแก้ไขและเนื่องจากพวกเขาจะถูกเชื่อมโยงจากเว็บเพจชื่อที่สั้นลงต้องมีความเสถียรเช่นพวกเขาควรจะสร้างในลักษณะที่ชื่อไฟล์ยาวเดียวกันจะส่งผลเสมอ ชื่อไฟล์ที่สั้นลงเหมือนกัน ฉันทำสิ่งนี้โดยสร้าง hex md5 ของชื่อไฟล์แบบยาวและต่อท้ายอักขระสี่ตัวแรกของชื่อนั้น (ชื่อยังสามารถชนกันได้ แต่มันก็ไร้ประโยชน์มากดังนั้นฉันจึงตรวจสอบเงื่อนไขนั้นและประกันตัวถ้ามันเกิดขึ้น) .

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

กล่าวโดยย่อ: ภาษาต่าง ๆ ได้รับการออกแบบสำหรับงานประเภทต่าง ๆ เลือกภาษาที่คุณสามารถใช้ได้ซึ่งเหมาะสมกับงานมากที่สุด


คุณไม่สามารถทำเช่นนั้นใน perl # / usr / bin / perl mv *.png $1(ความคิดเห็นไม่ได้จัดรูปแบบ) แต่ด้วย perl คุณสามารถใช้คุณสมบัติภาษาระดับสูงขึ้นได้
Poma

19

คำตอบที่มีอยู่นั้นใช้ได้เช่นกัน แต่ก็มีเหตุผลหนึ่งที่ยังไม่มีใครพูดถึง: เพราะมันจะอยู่ที่นั่น

การติดตั้ง * nix ที่ได้รับจะกระทำกับแพ็คเกจทางเลือกบางชุดซึ่งอาจหรือไม่สามารถโหลดได้และระบบบางระบบอาจไม่มี Python หรือ Perl หรือ Ruby แต่ถ้าระบบคาดว่าจะมีความสามารถในการโต้ตอบใด ๆ ก็จะมีเปลือก ซึ่งหมายความว่าเชลล์สคริปต์จะทำงานบนระบบจากเซิร์ฟเวอร์ไปยังเดสก์ท็อปของโปรแกรมเมอร์ไปจนถึงเดสก์ท็อปไคลเอ็นต์แบบเลขานุการไปยังอุปกรณ์ฝังตัวในระบบใด ๆ ที่สนับสนุนระบบไฟล์ที่เขียนได้และบรรทัดคำสั่ง bash

สำหรับคนที่เคยทำงานในสภาพแวดล้อมเซิร์ฟเวอร์ที่สอดคล้องกันเท่านั้นนี่เป็นสิ่งที่สามารถให้สิทธิ์ได้และไม่สำคัญ สำหรับคนที่ทำงานในสภาพแวดล้อมที่หลากหลายกว่านี้ไม่ควรมองข้าม


9

ตอบคำถามของคุณเป็นส่วนสำคัญที่นี่:

ทำไมภาษาสคริปต์ (เช่น Perl, Python, Ruby) ไม่เหมาะกับภาษาของเชลล์?

นี่คือข้อความที่ตัดตอนมาจากคำตอบของฉันสำหรับคำถามนั้น :

มีความแตกต่างสองสามอย่างที่ฉันสามารถนึกได้ คิดแค่ว่ามาที่นี่ตามลำดับโดยเฉพาะ:

  1. Python & Co. ถูกออกแบบมาให้ใช้งานสคริปต์ได้ดี Bash & Co. ได้รับการออกแบบมาให้เขียนสคริปต์ได้ดีเท่านั้นโดยไม่มีการประนีประนอมใด ๆ IOW: Python ถูกออกแบบมาให้ทำงานได้ดีทั้งในการเขียนสคริปต์และไม่ใช่สคริปต์ Bash ใส่ใจเฉพาะการเขียนสคริปต์เท่านั้น

  2. Bash & Co. ถูกยกเลิกการพิมพ์ Python & Co. จะพิมพ์อย่างรุนแรงซึ่งหมายความว่าจำนวน123สตริง123และไฟล์123แตกต่างกันมาก อย่างไรก็ตามพวกเขาไม่ได้พิมพ์แบบคงที่ซึ่งหมายความว่าพวกเขาจำเป็นต้องมีตัวอักษรที่แตกต่างกันสำหรับพวกเขาเพื่อให้พวกเขาออกจากกัน ตัวอย่าง:

    • Ruby: 123(หมายเลข), Bash:123
    • Ruby: '123'(สตริง), ทุบตี:123
    • Ruby: /123/(regexp), Bash:123
    • Ruby: File.open('123')(ไฟล์), Bash:123
    • Ruby: IO.open('123')(ตัวอธิบายไฟล์), Bash:123
    • Ruby: URI.parse('123')(URI), Bash:123
    • Ruby: `123`(คำสั่ง), Bash:123
  3. Python & Co. ได้รับการออกแบบให้ปรับขนาดได้สูงสุด 10,000, 100000 หรืออาจเป็น 1000000 รายการโปรแกรม Bash & Co. ได้รับการออกแบบมาเพื่อลดขนาดโปรแกรมอักขระได้สูงสุด 10 รายการ

  4. ใน Bash & Co. , ไฟล์, ไดเรกทอรี, ตัวอธิบายไฟล์, โพรเซสเป็นออบเจ็กต์ชั้นหนึ่งทั้งหมดใน Python เฉพาะออบเจ็กต์ Python เท่านั้นที่เป็นเฟิร์สคลาสหากคุณต้องการจัดการไฟล์, ไดเร็กตอรี่ ฯลฯ คุณต้องล้อมไว้ด้วย วัตถุ Python ก่อน

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

ฉันรู้สึกว่าการพูดถึงประเด็นเหล่านี้ด้วยการปิดฟีเจอร์หรือ DSL ลงบนภาษาการเขียนโปรแกรมเอนกประสงค์ใช้ไม่ได้ อย่างน้อยฉันก็ยังไม่เห็นการใช้งานที่น่าเชื่อถือ มี RuSH (Ruby shell) ซึ่งพยายามใช้ shell ใน Ruby มี rush ซึ่งเป็น DSL ภายในสำหรับการเขียนโปรแกรมเชลล์ใน Ruby มี Hotwire ซึ่งเป็น Python shell แต่ IMO ไม่เคยมีใครเข้ามาใกล้ เพื่อแข่งขันกับ Bash, Zsh, ปลาและเพื่อน ๆ


ลิงค์ที่ใช้งานไม่ได้: คำถามและคำตอบนี้คุณอ้างอิงถึงที่ไหน? หรือทั้งหมดที่เป็นประโยชน์คัดลอกมาที่นี่?
Wolf

1
@ Wolf: เห็นได้ชัดว่ามันถูกลบเพราะอยู่นอกหัวข้อหลังจากผ่านไปเกือบสามปี นั่นเป็นโชคร้าย
Jörg W Mittag

1
นี่คือคำถามรุ่นเก่าที่เก็บไว้: web.archive.org/web/20140528035940/http://stackoverflow.com/…
waldyrious

1

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

ในทางตรงกันข้ามถ้างานเขียนโปรแกรมของคุณมีความต้องการโครงสร้างการควบคุม (ถ้า / แล้ว / อื่น ๆ ), โครงสร้างวนซ้ำ (ลูป), ฐานข้อมูล & ไฟล์ I / O, ฯลฯ ก็อาจจะเหมาะสำหรับคนที่มีความสามารถมากกว่า ภาษาการเขียนโปรแกรมกว่าเชลล์สคริปต์

ฉันคิดว่ากฎง่ายๆคือ:

automatingSimpleTask ? shellScript() : programmingLanguage();

2
ไม่ควรจะเป็นshellScript() if automatingSimpleTask else programmingLanguage() ฮ่า ๆ
gahooa

1
@gahooa haha ​​แสดงให้เห็นว่าฉันอยู่ข้างรั้วใด
CFL_Jeff

1

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


0

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

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


0

การเขียนสคริปต์เชลล์เป็นภาษาการเขียนโปรแกรมตีความ นี่คือเหตุผลบางประการที่ฉันเลือกเขียนสคริปต์ใน bash แทน perl หรือ python หรือภาษาสคริปต์อื่น ๆ :

ทำงานได้ทุกที่ : ล่ามที่ซับซ้อนมากขึ้นอาจไม่สามารถใช้งานได้เช่นในระหว่างการเริ่มต้นระบบหรือในระบบฝังตัว Bash สามารถใช้ได้แม้ใน busybox

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

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

หากโปรแกรมมี 30 บรรทัดหรือน้อยกว่าปกติฉันจะเขียนโดยใช้การเขียนสคริปต์เชลล์ หากมีการจัดการที่ซับซ้อนหรือซับซ้อนหรือการวิเคราะห์ที่จะจัดการกับฉันจะทำมันโดยใช้หลามหรือ Perl


-1

คุณควรดูที่ coffeescript คำพูดของพวกเขา:

ภายใต้เครื่องหมายวงเล็บและเซมิโคลอนที่น่าอึดอัดใจเหล่านี้ JavaScript มีรูปแบบวัตถุที่งดงามอยู่เสมอ CoffeeScript เป็นความพยายามที่จะเปิดเผยส่วนที่ดีของ JavaScript ในวิธีที่ง่าย

กฎทองของ CoffeeScript คือ: "มันเป็นแค่จาวาสคริปต์"

อืม ... ที่นี่คำตอบที่ดีสำหรับผู้เริ่มต้น

ในฐานะผู้เริ่มต้นเรียนรู้อัตโนมัติในช่วง 6 เดือนที่ผ่านมาและได้ลิ้มรส C, C ++, Javascript และ Bashscript เล็กน้อยในวันสุดท้าย ... ฉันสามารถบอกคุณได้:

เชลล์สคริปต์เช่นเดียวกับที่เขียนใน bash สามารถทำหลายสิ่งได้ พวกเขาสามารถเรียกโปรแกรม Unix, ไพพ์เอาท์พุท, เปลี่ยนเส้นทาง I / O จาก / ไปยังไฟล์, โฟลว์การควบคุม, ตรวจสอบว่ามีไฟล์อยู่หรือไม่ ฯลฯ

และนี่ไม่ใช่เรื่องง่ายที่ยอดเยี่ยม! ? ลูปและตัวแปร? ว้าว!

หลามและทับทิมสามารถทำสิ่งเหล่านี้ได้ และพวกเขา (ฉันคิดว่า) อ่านได้ง่ายขึ้นและบำรุงรักษาได้มากขึ้น

โปรดบอกฉันว่าคุณเห็นสิ่งนี้ที่ไหน ฉันเขียน bashscript ในgeditแม้ในgeanyและฉันสามารถจัดรูปแบบ (tabs?) และฉันอ่านรหัสของฉันในความเร็วแสงโดยใช้ bashscript ในการเปรียบเทียบกับภาษาอื่น

ภาษานี้มีเครื่องมืออื่น ๆ ที่จะรักษาความสงบเรียบร้อยหรือไม่? ฉันรู้ว่าอ็อบเจกต์เชิงวัตถุจะบันทึกโค้ดจำนวนมาก แต่ ... ผู้คนบอกว่า bashscript นั้นเป็น OO ด้วย! ว้าว 2! นั่นคือจุดของฉันที่นี่ กำลังจะ:

ข้อดีของเชลล์สคริปต์

อยู่ในคำถามนี้: ทำอย่างไรในสิ่งที่bashdamnสิ่งนี้สามารถทำได้ใน perl หรือ phyton หรือ ruby? มันเป็นเรื่องง่าย?

( bashdamnthing = xdotool )


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