มีเหตุผลที่จะใช้ทุบตีมากกว่า zsh หรือไม่ [ปิด]


33

ฉันอยากรู้ว่าทำไมคนเราถึงต้องการใช้ bash แทน zsh ฉันหมายถึง zsh เต็มที่เข้ากันได้กับ bash อย่าเข้าใจฉันผิด: ฉันไม่ชอบทุบตีหรืออะไรก็ตาม ฉันแค่อยากรู้ว่ามีประโยชน์ในการใช้มันมากกว่า zsh หรือไม่

ดังนั้นมีเหตุผลอะไรที่จะใช้ทุบตีมากกว่า zsh?


2
แค่ต้องการชี้ให้เห็นว่า ZSH นั้นไม่รองรับการย้อนกลับอย่างเต็มที่กับ BASH ใน ZSH การจัดทำดัชนีอาร์เรย์เริ่มต้นที่ 1 - ใน BASH การทำดัชนีอาร์เรย์เริ่มต้นที่ 0 มีความแตกต่างอื่น ๆ เช่นกัน แต่ฉันต้องการชี้จุดนี้ออก
Charles Addis

คำตอบ:


29

เหตุผลสองประการที่ทำให้นึกถึง:

ครั้งแรก - มันใช้ได้จริงทุกที่ ฉันมีระบบ Linux หลายระบบ (CentOS 4.x ในกรณีนี้) ซึ่งไม่ได้ติดตั้ง zsh ในทำนองเดียวกันฉันต้องสัมผัสกับระบบโบราณเช่น Solaris 2.6 ขึ้นไป, HP-UX 10 ขึ้นไปและ AIX รุ่นลั่นดังเอี๊ยด ดังนั้นฉันค่อนข้างจะต้องใช้ทุบตีบนคอมพิวเตอร์เหล่านี้ซึ่งฉันทำเพราะฉันแตะหลายสิบถ้าไม่นับร้อยเครื่องคอมพิวเตอร์ในแต่ละเดือนและเพื่อให้ได้ความสอดคล้องในส่วนต่อประสานของคุณคุณท้ายติดกับการใช้ ค่าเริ่มต้น

ประการที่สอง - มันใช้ได้จริงทุกที่ นี่หมายความว่าฉันสามารถเขียน bash shell script และมั่นใจได้ 99% ว่ามันจะทำงานเมื่อถ่ายโอนไปที่อื่น

ใช่เหตุผลเหล่านี้มีผิวเผินเหมือนกัน แต่เหตุผลเบื้องหลังนั้นแตกต่างกัน


2
ฉันจำได้ว่ามี ksh88 / ksh93 บน HPUX เราไม่เคยเข้าถึงการติดตั้ง bash
Zlemini

24

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

ฉันพบว่าสิ่งนี้ช่วยให้ทุกอย่างง่ายขึ้นแม้ในขณะที่ฉันจับจ่ายอะไรก็ตามที่เข้ากันได้กับทุบตี (setopt SH_WORD_SPLIT?) ฉันยังคงพบความแตกต่างเล็กน้อย


3
นั่นจะเป็นระบบ GNU / Linux ทุกระบบที่คุณหมายถึง?
andol

2
ฉันพบว่ามันมาพร้อมกับ OS / X และ bsd ฉันไม่ได้มีประสบการณ์มากกับคนอื่น ๆ ของ nix พวกเขา (เวอร์ชั่นล่าสุด) มักจะไม่ทุบตีหรือไม่?
Kyle Brandt

1
เวอร์ชันเก่าของ Solaris ไม่รวม bash; ฉันมักจะต้องพึ่งพาบอร์นเป็นเปลือกสำหรับการเขียนสคริปต์ สิ่งนี้ไม่ได้เกิดขึ้นซักพักแล้ว แต่คุณยังอาจพบเจอในองค์กรขนาดใหญ่บางแห่ง
user5336

3
ต้องแตกต่างจาก BSD: s อย่างน้อยใน OpenBSD และ FreeBSD คุณต้องติดตั้ง bash แยกต่างหากจากพอร์ต / แพ็คเกจ
andol

andol: นั่นคือสิ่งที่ฉันเคยใช้ .. ฉันต้องจำไว้ไม่ถูกต้องหรือฉันทำอย่างนั้นและก็จำไม่ได้
Kyle Brandt

13

zsh ไม่รองรับการใช้งานอย่างเต็มที่ มีความแตกต่างหลากหลาย zsh ที่ใหม่กว่าเข้ากันได้กับ bash (สนับสนุน =, exec ตอนนี้มีตัวเลือกการตั้งค่าสถานะพิเศษ ฯลฯ ) แต่ความเข้ากันได้เต็มรูปแบบไม่ใช่เป้าหมายแม้ภายใต้ "จำลอง"

ตัวอย่างเช่นสตริงย่อยของ bash คือ $ {foo: offset: len} แต่ใน zsh คือ $ foo [start, end] และนั่นเป็นเพียงตัวอย่างง่ายๆ

zsh เป็นเปลือกที่ได้รับอิทธิพล tcsh และ ksh ซึ่งทำสิ่งต่าง ๆ ในแบบของมันเอง ความเข้ากันได้ของ POSIX ไม่ใช่เป้าหมายอย่างชัดเจน แต่นักพัฒนาสามารถตอบสนองต่อแพตช์ที่เพิ่มตัวเลือก / เลียนแบบพฤติกรรมที่เข้าใกล้ POSIX ได้มากขึ้น แต่เมื่อคุณเริ่มเข้าสู่พลังของเชลล์จริงๆแล้วคุณเริ่มสร้างสคริปต์แบบเขียนอย่างเดียวยิ่งกว่าทุบตี

bash คือ POSIX sh + ksh + pedanticism พร้อมกับคุณสมบัติบางอย่างที่คัดลอกมาจาก zsh มันก็มีสคริปต์เขียนเพียง แต่เพราะมีผู้ประกอบการที่มีประสิทธิภาพน้อยกว่าคุณจะจบลงไม่ได้ใช้ความรัดกุมของ zsh และสิ่งที่อาจจะอ่านได้มากขึ้น (ยกเว้นสำหรับทุกข้อความที่จะหลีกเลี่ยงช่องว่างแยกที่โง่ ksh สไตล์หมายถึง $ อาร์เรย์แรก - องค์ประกอบของอาร์เรย์ไม่ใช่องค์ประกอบทั้งหมดของอาร์เรย์ ฯลฯ )

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

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


6
nb: $ {foo: offset: len} จะได้รับการสนับสนุนในขณะนี้ใน zsh สำหรับการทำงานร่วมกัน
Phil P

6

คำแนะนำของฉัน: หากคุณกำลังพกพาได้อย่างเต็มที่เขียนโดยใช้กฎของ Bourne shell ไม่ต้องกังวลกับ Korn shell extension ดังที่กล่าวไว้นั่นคือ "กล่องใหญ่" ที่เก่ากว่าโดยรอบที่ไม่มีเชลล์ GNU อยู่เลย

Bash ทำ "มากเกินไป" แล้ว ฉันมีเพื่อนในที่ทำงานที่ชอบ zsh แต่ฉันไม่รู้ว่ามันทำอะไร

อย่างไรก็ตามเขียนสำหรับ Bourne (หรือ "bourne อีกครั้ง") shell หรือถ้าคุณทำสคริปต์ที่กำหนดเองสำหรับกล่องเฉพาะจำนวนน้อยให้ข้าม "shell hell" ทั้งหมดและเพียงแค่เขียนด้วย perl หรือ python (หรืออะไรก็ตาม ล่ามที่ติดตั้งในเครื่องที่คุณชื่นชอบคือ)


5

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

ตัวอย่างเช่นbash v4.x +แนะนำ:

  • วนซ้ำแบบซ้ำ:

    rm -f ** / *. บันทึก

  • autocd:

    พิมพ์ "/ tmp" แทน "cd / tmp"


2
bash copy features จาก zsh มีเหตุผลในการใช้ bash อย่างไร?
qqx

5

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

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

การพกพานั้นไม่แน่นอน มันพิสูจน์ได้ว่าคุณต้องใช้มันไปไกลแค่ไหน ตัวอย่างเช่น Fedora ใช้คำสั่งเชลล์เพื่อสร้างแพ็คเกจ RPM และแนวทางบรรจุภัณฑ์ของ Fedora ระบุว่าเนื่องจากแพ็คเกจทั้งหมดจะต้องถูกสร้างขึ้นบน Fedora จึงเป็นเรื่องดีที่จะใช้คุณสมบัติทั้งหมดของ BASH แม้ว่า distros อื่น ๆ ตามหลักวิชาที่ไม่มี BASH อาจต้องการนำ RPMs กลับมาใช้ใหม่ แต่พวกเขาก็ตัดสินใจเรื่องความสะดวกในการพกพาตามการใช้งานจริงแทนที่จะเป็น "ALWAYS UZE POSIX !! 1" มนต์ของคุณ

ZSH ไม่ได้ติดอยู่ในฐานะเชลล์เริ่มต้นเพียงเพราะมันยุ่งเหยิงไปกับความคิดที่อ่อนหัด


2
คุณสามารถอธิบายได้ว่าคุณลักษณะหรือแนวคิดใดใน zsh ที่คุณพบว่าไม่เหมาะสมและทำไม
funroll

2

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

วิธีการที่เหมาะสมในการเขียนสคริปต์ยูนิกซ์แบบพกพาไปใช้งานshซึ่งจะพบได้ในระบบระวังทุก *

เชลล์อื่น ๆ ยกเว้นshเป็นเพียงเครื่องมือโต้ตอบรายวันของคุณ

เมื่อbashเทียบกับ vs zsh- bashรวมอยู่ในชุด*nixesมากกว่าzshดังนั้นนี่คือข้อเสียของการติดตั้งซอฟต์แวร์เพิ่มเติมลงในระบบ - คุณต้องรักษาไว้ บางคนชอบ "คุณสมบัติเจ๋ง ๆ " zsh ดังนั้นพวกเขาจึงชอบจ่ายราคานั้นบางคนไม่ชอบ


2
การใช้งานที่ทันสมัยหลายแห่งของ SH เป็นเพียงลิงก์ไปสู่การทุบตี
user9517 รองรับ GoFundMonica

2
@Iain อูบุนตูใช้ประโดยค่าเริ่มต้นและแม้ว่าเป็นทุบตีมันช่วยให้โหมดที่เข้ากันเมื่อใช้เป็นsh sh
mgorven

2

จุดอื่น:

โปรแกรมส่วนใหญ่จะจัดเตรียมการทุบตีเสร็จสมบูรณ์โดยค่าเริ่มต้น สำหรับฉันมันเป็นเหตุผลที่จะไม่เปลี่ยน

[เพิ่มในกรกฎาคม 2013] หลังจากใช้ zsh มาสองสามปีแล้วหลังจากความคิดเห็นข้างต้นฉันต้องบอกว่าการเติมแท็บเสร็จสมบูรณ์ (แม้จะสร้างขึ้นภายในไม่มีการแก้ไขครั้งที่ 3) จะยอดเยี่ยมและดูเหมือนว่าเกินกว่าที่เสนอโดยทุบตี . :)


3
ผมคิดว่าผลงานที่มี ZSH เป็นอย่างดีด้วยความสมบูรณ์แท็บใน ZSH ผมได้รับจำนวนมากของการขัดแย้งโปรแกรมเฉพาะ ...
ไคล์ Brandt

น่าสนใจ คุณกำลังบอกว่าไฟล์ bash เสร็จแล้วทำงานกับ zsh หรือเพียงบางโปรแกรมมีสิ่งที่เสร็จสิ้นเฉพาะ zsh หรือไม่ ยังคงมีรูปแบบ std บางส่วนของไฟล์ bash complete ที่ zsh อาจหรือไม่พิจารณาโดยอัตโนมัติ คุณได้ปรับแต่ง zsh ของคุณเพื่อให้ทำงานได้หรือไม่
วอย Kaczmarek

@Wojciech Kaczmarek: ผมคิดว่าคุณต้องการ 19.3 จากต่อไปนี้: zsh.sourceforge.net/Doc/Release/zsh_19.html สุจริตผมไม่เคยเอาเวลาที่จะเข้าใจจริงๆมันเพียงแค่ฉีก .zshrc ฉันพบออนไลน์ :-) แต่มันจะเสร็จสมบูรณ์อาร์กิวเมนต์บรรทัดคำสั่งจากโปรแกรมเช่นฉลาด, grep ฯลฯ ....
ไคล์ Brandt

5
การทำให้แท็บของ bash นั้นใกล้เคียงกับระบบการเติมแท็บเก่าของ zsh อย่างมาก นี่เป็นหนึ่งในแนวคิดที่คัดลอกมาจาก zsh ไปยัง bash (มีอีกหลายคนที่คัดลอก bash ไปยัง zsh) คุณสามารถใช้สคริปต์เสร็จสมบูรณ์ที่เขียนขึ้นสำหรับ bash ใน zsh โดยเรียกใช้ "bashcompinit" จากนั้นใช้คำสั่ง "สมบูรณ์" และ / หรือ "compgen" ภายใน zsh - สิ่งนี้เป็นไปได้เนื่องจากฟังก์ชัน bash เป็นชุดย่อยของ zsh และ สามารถเลียนแบบได้ ดังนั้นจึงไม่มีเหตุผลที่จะเปลี่ยนเป็นการทุบตีเพราะคำสั่งมาพร้อมกับการทุบตีให้สมบูรณ์
Phil P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.