การเขียนสคริปต์ทางเลือกกับสคริปต์เชลล์ Bash


16

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

  1. ภาษาสคริปต์ใดที่ใช้กันอย่างแพร่หลายมากที่สุดในโลกแห่งความเป็นจริง
  2. ภาษาสคริปต์ใดที่คล้ายกับไวยากรณ์ C / C ++ มากที่สุด
  3. มีภาษาสคริปต์อื่นที่ฉันไม่ทราบหรือไม่?

ขอบคุณสำหรับความช่วยเหลือของคุณ,

สกอตต์


2
นี่น่าจะเป็นวิกิชุมชน
EBGreen

2
ตอนนี้ฉันใช้ PHP จริงสำหรับงานระบบส่วนใหญ่ ฉันจะรวบรวมคำตอบที่เหมาะสมกับเรื่องนี้ในไม่ช้า มีห้องสมุดมากมายในตัวซึ่งมีประโยชน์
Kyle Hodgson

ภาษาที่เชลล์ตั้งใจทำบางสิ่งที่ภาษาอื่นอาจไม่ทำ ซึ่งมีการจัดการและเก็บไว้ในการตรวจสอบกระบวนการเด็กทั้งหมดที่เกิดซ้ำที่เคยเกิดขึ้น บล็อกโฆษณา Phusion Passenger อธิบายว่าทำไมในรายละเอียด: phusion.github.io/baseimage-dockerในระยะสั้นสคริปต์ของคุณที่เขียนด้วย lang-x อาจไม่จัดการกับรูทีนการปิดอย่างถูกต้อง ซึ่งเป็นสิ่งที่ดีอย่างสมบูรณ์ตราบใดที่คุณเรียกใช้พวกเขาเป็นลูกของกระบวนการเปลือกจริง ข้อจำกัดความรับผิดชอบฉันไม่มีความเชี่ยวชาญ ข้อมูลนี้เป็นเพียงความเข้าใจที่ดีที่สุดของฉันเท่านั้นซึ่งอาจมีข้อบกพร่อง
ThorSummoner

คำตอบ:


12

ในระดับหนึ่งมันเป็นเรื่องของความชอบส่วนตัว Perl และ Python นั้นขึ้นอยู่กับความนิยม

หากต้องการตอบคำถามสองในสามข้อของคุณ:

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

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


1
ฉันสองที่ ฉันพบ Python ง่ายต่อการเรียนรู้และสามารถทำทุกอย่างที่ฉันทำได้เพราะมันใช้งานได้ดีในระบบปฏิบัติการเก่า / 2 วันกับ REXX
slovon

3
+1 สำหรับ python ... พลังของ C ในภาษาสคริปต์ คุณสามารถทำให้สคริปต์ของคุณเรียบง่ายหรือซับซ้อนเท่าที่คุณต้องการ;)
KFro

1
บนระบบที่ไม่ใช่ NT โมดูล python shทำให้การใช้ python เป็นภาษาสคริปต์เชลล์สามารถเข้าถึงได้ อย่างไรก็ตามหากคุณพบเจอกับเคสแบบขอบ (เช่นการประมวลผลแบบมัลติโพรเซสเซอร์) คุณจะต้องเรียนรู้โมดูลย่อยที่ฉันมาจนถึงทุกวันนี้ยากที่จะใช้
ThorSummoner

5

Perl และ Python เป็นคำตอบที่ชัดเจน แต่แต่ละคนใช้เพื่อทำงานที่แตกต่างกัน:

  1. Bash - เขียนสิ่งที่ง่ายที่สุดในการเรียนรู้ ด้วยสคริปต์ Bash คุณสามารถรันคำสั่งและจัดการเอาต์พุต
  2. Python - วิธีที่สองที่ง่ายที่สุดในการเรียนรู้ Python มีประโยชน์มากกว่า Bash เนื่องจากคุณสามารถใช้ Python เพื่อเขียนโปรแกรมแบบเต็มและชุมชนได้รับการสนับสนุนเป็นอย่างดี Python สามารถอ่านและแก้ไขได้ง่ายในภายหลัง
  3. Perl - สุดยอดหนึ่งในสาม (สำหรับการเขียนสคริปต์) แต่เป็นช่วงการเรียนรู้ที่ชันที่สุด มีการสนับสนุนการแสดงออกปกติที่ดีมาก (ซึ่งเป็นเหตุผลหลักที่ยังคงมีการใช้งานอยู่ในปัจจุบัน) และคุณอาจพบสคริปต์ Perl จำนวนมากเมื่อเวลาผ่านไป ปัญหาหลักของ Perl คือการอ่านโค้ดได้ - เดือนหลังจากที่คุณเขียนโค้ดคุณจะไม่สามารถรู้ได้ว่ามันทำอะไร ดังนั้นคุณควรแสดงความคิดเห็นอย่างหนัก
  4. Awk / Sed - ทั้งสองมีประโยชน์มาก แต่ก็ยากที่จะเรียนรู้ ฉันขอแนะนำให้จัดการกับสิ่งเหล่านี้ครั้งสุดท้ายเว้นแต่ว่าคุณจะมีรูปแบบที่ดี

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

และสำหรับคำตอบสำหรับคำถามของคุณ:

ภาษาสคริปต์ใดที่ใช้กันอย่างแพร่หลายมากที่สุดในโลกแห่งความเป็นจริง

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

ภาษาสคริปต์ใดที่คล้ายกับไวยากรณ์ C / C ++ มากที่สุด

Perl

มีภาษาสคริปต์อื่นที่ฉันไม่ทราบหรือไม่?

Ruby, Tcsh / Csh, http://en.wikipedia.org/wiki/Interpreted_language


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

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

3

awk สำหรับงานเล็ก ๆ , python สำหรับมากกว่า oneliners

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

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


1

ฉันจะบอกว่า perl และ python น่าจะเป็นทางเลือกที่ดีที่สุดสองทาง คุณสามารถทำอะไรได้มากมายด้วยความเยือกเย็นและหวาดกลัวเช่นกัน


1

Sh (bourne shell), grep, awk และ sed เป็นสิ่งที่ดีเสมอที่จะได้รับการจับอีกครั้ง Perl นั้นยอดเยี่ยมถ้าคุณไม่ได้จดข้อความจำนวนมากและการบำรุงรักษาไม่ใช่เรื่องสำคัญ (ไม่ใช่บอกว่าเป็นไปไม่ได้) งูหลาม; ถ้าการอ่านเป็นสิ่งสำคัญสำหรับคุณ ความชอบของฉันคือ Python แต่เครื่องมือเหล่านี้ดีสำหรับทุกสิ่งที่คุณใช้ คุณอาจต้องการพิจารณาทบทวนความต้องการด้านไวยากรณ์ของ c / c ++ อีกครั้งการติดค้างไว้จะไม่ช่วยคุณในระยะยาว


ขอบคุณมาร์ติน ฉันสังเกตเห็น (จากตัวอย่างบนเว็บ) ว่า Perl มีความคล้ายคลึงกับ PHP อย่างน่าทึ่ง (แม้ว่าฉันแน่ใจว่าเป็น Perl ก่อน PHP ในอดีต) นี่เป็นข้อความที่ยุติธรรมหรือไม่?
Scott Davies

PHP 1.0 เป็น Perl สคริปต์ดังนั้นจึงไม่ใช่เรื่องบังเอิญ :)
บิลไวส์

1

หากคุณต้องการเรียนรู้บางสิ่งบางอย่างตั้งแต่เริ่มต้นอาจเป็นการดีที่สุดที่จะเรียนรู้การทุบตี

นอกเหนือจากนั้น perl และ python ก็เป็นที่นิยมในทุกวันนี้ ฉันเป็นบางส่วนของ Perl แต่สไตล์การเขียนสคริปต์ของฉันไม่ได้เปลี่ยนแปลงมากนักตั้งแต่ Perl 4 หมดไป

ฉันไม่รู้จักภาษาสคริปต์ "c-syntax-like" ใด ๆ


1

Perl, มือถ้าเพียงสำหรับทรัพยากรที่เหลือเชื่อของ CPAN ( http://search.cpan.org/ ) ประโยชน์ของการใช้ภาษาสคริปต์กับชุมชนที่มีส่วนร่วมขนาดใหญ่เช่นนี้คือคุณไม่จำเป็นต้องประดิษฐ์บางสิ่งบางอย่างด้วยตัวเอง

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

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

ไวยากรณ์ Perl ยังสามารถใกล้เคียงกับ C อย่างยอดเยี่ยมตราบใดที่คุณสามารถหลีกเลี่ยงการพิมพ์และ sigils; การใช้ Perl ขั้นสูงจะเกิดขึ้นตามธรรมชาติในที่สุดคุณก็จะได้เรียนรู้จุดแข็งของภาษา

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

ป.ล. โพสต์นี้เต็มไปด้วยลิงก์ไปยังโมดูลการจัดการที่เป็นมิตรบน CPAN แต่ดูเหมือนว่าผู้ใช้ใหม่สามารถโพสต์ได้เพียงลิงค์เดียวดังนั้นให้ใช้ลิงก์ CPAN นั้นเพื่อค้นหาสิ่งต่าง ๆ เช่น 'CVS' 'SVN' 'Cron' และ 'Moose' ระบบวัตถุที่กว้างขวาง)


1
  • ทับทิม
  • หลาม
  • Go - ภาษาข้ามแพลตฟอร์มการเขียนสคริปต์ถูกกล่าวถึงว่าเป็นหนึ่งในจุดแข็งของ Goหนึ่งในจุดแข็งของการเดินทาง
  • Node.js - ดู Grunt.js, Gulp.js. หลายโครงการกำลังใช้ Node.js เป็นเครื่องมืออัตโนมัติเชลล์
  • Perl

1

[สำหรับคำแนะนำการเขียนสคริปต์ทั่วไปดูคำตอบอื่น ๆ ]

คำตอบนี้เกี่ยวกับการใช้โปรแกรมบรรทัดคำสั่งและเชนขนาดใหญ่ของพวกเขา

สำหรับการรันเชนของโปรแกรม CLI และหลาย ๆ เชนเรียงตามลำดับ bash เป็นวิธีที่ง่ายที่สุด Perl สามารถทำสิ่งเดียวกันได้ แต่ภาษานั้นยากต่อการเรียนรู้และมีความซับซ้อนมากกว่าและหลาย ๆ คนได้ชี้ให้เห็นว่ามันง่ายต่อการเขียน Perl ที่เข้าใจได้ง่าย

หากคุณวนซ้ำไฟล์และพารามิเตอร์ทุบตีเป็นวิธีที่ง่ายที่สุดที่จะไป b / c คุณสามารถสร้างต้นแบบในเชลล์แล้วคัดลอกลงในสคริปต์และเพิ่มอาร์เรย์และลูปบางส่วนด้วยค่าใช้จ่ายน้อยที่สุด

ตัวอย่างของสิ่งที่ฉันหมายถึง:

$ cat input.dat | numerical_model source_data ${SRC} grid_size ${GRID_SIZE} param1 ${P1} param2 ${P2} | tee ${OUTPUT} | plotter title ${TITLE} ylabel ${YLABEL} xlabel ${XLABEL} > ${OUTPUT_FIG}
$ cat ${OUTPUT} | stats_cmd bin_size ${BINSIZE} dist_type ${DIST_TYPE} | tee ${OUTPUT_STATS} | plotter plot_type ${PLOT_TYPE} title ${TITLE_STATS} > ${OUTPUT_FIG_STATS}

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

Perl และ Python อาจดีกว่าสำหรับสคริปต์ขนาดใหญ่เนื่องจากมีไวยากรณ์ที่สะอาดกว่าสำหรับการวนซ้ำและตัวแปร แต่คำสั่ง bash จะต้องสร้างเป็นสตริงเรียกใช้เป็นกระบวนการย่อยและ stdin, stdout ที่ถูกจับ สามารถทำได้ แต่ไม่สามารถแทนที่สภาพแวดล้อมเชลล์เนทีฟได้อย่างสมบูรณ์

ถ้ากระสุนมีภาษาที่ดีกว่านี้จะหลีกเลี่ยงได้ทั้งหมด


0
  1. ใช้มากที่สุด: Perl ส่วนใหญ่ด้วยเหตุผลทางประวัติศาสตร์ Python พร้อมใช้งานอย่างแพร่หลายใน Linux และ BSD distros ทั้งหมด (ติดตั้งได้แม้ใน Mac OSX) และยังดีกว่าการเรียนรู้ / โปรแกรม แน่นอนว่าเมื่อคุณได้รับไวยากรณ์แล้ว Bash นั้นง่ายสำหรับเกือบทุกสิ่งที่คุณสามารถทำได้ที่บรรทัดคำสั่ง ท้ายที่สุดมันเป็นบรรทัดคำสั่ง

    • ไวยากรณ์ C: มีcshแต่คุณสามารถติดตั้งTCCและใช้จริง C เป็นภาษาสคริปต์รวบรวมจากแหล่งในเวลาน้อยกว่าการเริ่มต้นภาษาอื่น ๆ

    • ภาษาสคริปต์อื่น ๆ : มากมาย! Lua , Ruby , JavaScript ...


0

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

สุดท้าย แต่ไม่ท้ายสุดฉันจะไม่ใช้ perl หรือ python ถ้าฉันต้องสมมติว่าดัมพ์ฐานข้อมูลทั้งหมดจากเซิร์ฟเวอร์ mysql ทุกคืน (แต่ละฐานข้อมูลในไฟล์การถ่ายโอนข้อมูลของตัวเอง) ทาร์และ rsync ไปยังเซิร์ฟเวอร์อื่น ทำไม เพราะมันเร็วและง่ายกว่าในการเขียนใน bash :)

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


0

ฉันชอบทับทิม มันง่ายและง่ายต่อการโปรแกรมด้วย มีหนังสือที่ดีในเรื่องการบริหารระบบโดยใช้ทับทิม

Ruby ใช้ในระบบการจัดการการกำหนดค่าหลายอย่าง (capistrano, Chef, puppet) และ metasploit รุ่นล่าสุด

คุณสามารถใช้รัชกาลแทนที่เชลล์ Unix ด้วยไวยากรณ์ ruby ​​และทำสิ่งนี้:

local = Rush::Box.new('localhost') 
remote = Rush::Box.new('my.remote.server.com')     
local_dir = local['/Users/adam/myproj/']
remote_dir = remote['/home/myproj/app/']

local_dir.copy_to remote_dir
remote_dir['**/.svn/'].each { |d| d.destroy }

ขอบคุณ chmeee ฉันไม่รู้ว่าคุณสามารถใช้ Ruby สำหรับดูแลระบบ - ฉันคิดเสมอว่ามันเป็นเว็บเป็นศูนย์กลาง ฉันกำลังมองหาบางอย่างที่องค์กรส่วนใหญ่ใช้อยู่ มันยุติธรรมที่จะบอกว่าทับทิมสำหรับดูแลระบบยังคงมีเลือดออกขอบเกินไป?
Scott Davies

1
Shell / Perl เป็นสองภาษาเท่านั้นที่คุณสามารถค้นหาติดตั้งได้ทุกที่ ไพ ธ อนอาจเป็นสิ่งที่พบได้บ่อยที่สุดโดยทับทิมนั้นวิ่งไปไกลเป็นอันดับสี่
Cian

@ScottDavies PHP และ ASP.net เป็นภาษาเดียวที่ฉันรู้จัก แม้กระทั่งจาวาสคริปต์ที่ออกแบบมาเพื่อทำงานบนเว็บโดยเฉพาะนั้นยังไม่ผ่านการตรวจสอบแบบฟอร์มมาก่อน อย่างไรก็ตามคุณสามารถจัดส่ง html ด้วยภาษาใดก็ได้แม้เห็นได้ชัดว่าทุบตี
ThorSummoner

0

ตัวอย่าง Ruby one-liners:

> echo 'Shell is the best!' | ruby -pe 'gsub("Shell", "Ruby")' 

Ruby is the best!

> printf "foo\nbar\nbaz\n" |  ruby -ne 'BEGIN { i = 1 }; puts "#{i} #{$_}"; i += 1'

1 foo
2 bar
3 baz

ฉันจะใช้ทับทิม

เปรียบเทียบกับ sh มันทันสมัยและมีประสิทธิภาพ

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

เปรียบเทียบกับ Perl โรงเรียนเก่าเล็กน้อยและไวยากรณ์ซับซ้อนเกินไปสำหรับฉัน

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