คุณสมบัติเฉพาะของทุบตีเมื่อเทียบกับ zsh


67

ฉันเป็นผู้ใช้ zsh มาระยะหนึ่งแล้ว (ก่อนหน้า tcsh และก่อนหน้านั้น csh) ฉันมีความสุขมากกับมัน แต่ก็สงสัยว่ามีคุณสมบัติที่น่าสนใจของทุบตีที่ไม่มีอยู่ใน zsh และในทางกลับกันมีคุณสมบัติ zsh ที่ไม่มีอยู่ใน bash ความรู้สึกปัจจุบันของฉันคือการทุบตีนั้นดีกว่า:

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

ไม่พยายามเริ่มการต่อสู้ทางศาสนาที่นี่ซึ่งเป็นสาเหตุที่ฉันแค่มองหาคุณสมบัติที่มีอยู่ในกระสุนเพียงนัดเดียว


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

คำตอบ:


40

zsh สำหรับ vulcans ;-)

อย่างจริงจัง: ทุบตี 4.0 มีคุณสมบัติบางอย่างก่อนหน้านี้พบใน zsh เช่น ** กลม:

% ls /usr/src/**/Makefile

เทียบเท่ากับ:

% find /usr/src -name "Makefile"

แต่เห็นได้ชัดว่ามีประสิทธิภาพมากขึ้น

จากประสบการณ์ของฉันการโปรแกรมเสร็จของ bash นั้นทำได้ดีกว่า zsh อย่างน้อยในบางกรณี

ทุบตีAlt + .ต้องแทรก!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...

8
ในทุบตีC-M-eที่ "เปลือกขยายเส้น" ซึ่งจะขยายตัวcat `echo blubb | sed 's/u/a/'` ไปcat blabbและecho $SHELLไปecho /bin/bashในกรณีของฉัน นอกจากนี้C-x *ที่ "glob ขยายคำ" rm *ซึ่งจะขยายตัว
วิกเตอร์

16

ฉันต้องการจะชี้ให้เห็นว่า bash ไม่ได้ถูกติดตั้งเป็นค่าเริ่มต้นใน FreeBSD, OpenBSD, หรือ NetBSD และยังไม่ได้ติดตั้งโดยค่าเริ่มต้นบน Solaris 10 (OpenSolaris เป็นค่าเริ่มต้น) ครั้งสุดท้ายที่ฉันใช้ AIX และหรือ เซิร์ฟเวอร์ HP-UX ที่ไม่ได้ติดตั้งเป็นค่าเริ่มต้น

นอกจากนี้ใน OpenSolaris / bin / sh จะไม่ทุบตี มันคือ ksh ปัญหาที่ใหญ่ที่สุดที่ฉันมีในฐานะ porter ซอฟต์แวร์คือคนที่สมมติว่า / bin / sh เป็น bash และมันจะยอมรับไวยากรณ์ที่เพิ่มขึ้นของ bash แม้ว่านี่จะเป็นกรณีของลีนุกซ์ส่วนใหญ่ แต่ก็ไม่ได้เป็นที่อื่นและมันน่ารำคาญจริงๆ


6
ใช่คุณถูก. อนึ่งผู้ค้าเหล่านี้แน่ใจว่าทำให้ติดตั้ง bash เป็นแพคเกจเสริมได้ง่ายมาก +1 สำหรับการชี้ให้เห็นความจำเป็นในการ / bin / sh purism ในสคริปต์
kubanczyk

@kubanczyk: หากคุณกำลังทำงานกับเครื่องที่คุณไม่สามารถเข้าถึงรูทได้มันอาจไม่ง่ายนักที่จะติดตั้งดังนั้นฉันคิดว่าจุดของ X-Istence (ฉันทำงานกับกล่อง Solaris หลายกล่องและ sysadmins เป็น ksh junkies ทั้งหมดครั้งสุดท้ายที่ฉันพยายามรวบรวมซอฟต์แวร์ของตัวเองที่ฉันไม่สามารถอยู่ได้โดยปราศจาก (git ในกรณีนี้) มีข้อบกพร่องกับคอมไพเลอร์ที่ติดตั้งดังนั้น เส้นทางนั้นถูกตัดออกไปสำหรับฉัน)
iconoclast

12

แม้ว่าฉันจะเป็นผู้ใช้ทุบตี แต่ฉันพบหนึ่งในคุณสมบัติของ zsh ที่ค่อนข้างดี: RPS1

โปรดจำไว้ว่า:

  • PS1: พรอมต์ชิดซ้าย
  • RPS1: พรอมต์ชิดขวา

ตัวอย่าง:

เมื่อใช้สิ่งที่ชอบ

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

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

คุณสามารถดูภาพหน้าจอของตัวอย่างนี้ที่http://imgur.com/OAZhC


9

Zsh มีการแก้ไขการสะกดคำ หากคุณเป็นตัวอักษร (หรือมากกว่า) ปิดมันจะคิดออกว่าคุณหมายถึงอะไร

นอกจากนี้ยังมีความสมบูรณ์ของแท็บที่สมบูรณ์ซึ่งฉันชอบ

Zsh มียูทิลิตี config แบบโต้ตอบเพื่อให้มันเป็นไปตามที่คุณต้องการ

การทดสอบความเร็วบางอย่างบอกว่า zsh นั้นเร็วกว่า แต่ฉันไม่ได้สังเกตเห็นความแตกต่างเลย


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

zshแม้จะมีการตั้งค่าให้อนุญาตสำหรับพิมพ์ 'ตัวอักษรหนึ่งตัวผิด' สำหรับการใช้แป้นพิมพ์ Dvorak
vgoff

6

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

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

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

คุณสมบัติที่นำเสนอใน zsh ที่ไม่ได้อยู่ในทุบตีดูเหมือนจะน่ารักส่วนใหญ่ แต่ไม่ใช่คนที่จะมีความสำคัญในแต่ละวัน


3

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


1

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


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

0

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

บางคนบอกว่าฉันกำลังงอปัจจัยที่เกินบรรยายด้วยการใช้ zsh แต่ฉันไม่สามารถยืนยันหรือปฏิเสธข่าวลือนั้นได้


5
และใช่ทุบตียังมีการสนับสนุนโหมด vi
pjz

@Milner: คุณสามารถอธิบายประเภทของการสนับสนุนโหมด vi ใน zsh ที่ไม่ได้อยู่ในทุบตี? หากคุณเพียงหมายถึงความสามารถในการตั้งค่า -o vi บนบรรทัดคำสั่งนั่นหมายความว่าทั้งสองอย่างชัดเจน หากมีการสนับสนุนเพิ่มเติมใน zsh คุณสามารถอธิบายได้อย่างชัดเจนว่ามันคืออะไรและมันเพิ่มอะไรเข้าไป
iconoclast

-1

ความนิยม, #bash 430 ผู้ใช้ ผู้ใช้ #zsh 123 คน ฉันเชื่อว่าเว็บไซต์ zsh มีการเปรียบเทียบที่ดีของ zsh กับกระสุนอื่น ๆ zsh รองรับโหมด vi ได้ดีกว่า


2
โหมด vi ใน zsh ดีขึ้นอย่างไร? ฉันเป็นผู้ใช้ทุบตีและเปิดโหมด vi ดังนั้นฉันอยากทราบว่ามีประโยชน์ในการสลับเปลี่ยนหรือไม่
ptman

1
@ptman: การแจ้งเตือนของ zsh สามารถบอกโหมดได้ (แทรก / ปกติ) Readline ไม่สามารถทำเช่นนั้นได้ ผู้บอกบทมีความยืดหยุ่นมากขึ้นเช่นกัน: คุณสามารถเน้นไวยากรณ์ได้!
unperson325680

@progo: อ่า! ดีมาก. ตอนนี้ฉันอาจเริ่มใช้โหมด vi ใน zsh นั่นเป็นเหตุผลหนึ่งที่ฉันติดกับโหมด emacs จนถึงตอนนี้
iconoclast

@Brandon ว่าการปรับปรุงเล็ก ๆ น้อย ๆ นั้นเป็นเหตุผลที่ฉันจะเปลี่ยนหอย
unperson325680

-1

Bash ใช้ไวยากรณ์เดียวกันสำหรับ if และ while ซึ่งสามารถใช้ได้ในสคริปต์ / bin / sh บนบรรทัดคำสั่ง
ภายใน zsh ไวยากรณ์จะแตกต่างกัน การใช้ zsh อย่างมีประสิทธิภาพนั้นคุณต้องจำทั้งสองอย่างไว้ถ้าคุณใช้คำสั่ง if- หรือ while-command ในบรรทัดคำสั่งของคุณ


1
ฉันลองสิ่งนี้โดยใช้if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fiทั้งบรรทัดคำสั่งและสคริปต์และทำงานได้ตามที่คาดไว้ในทั้งสองกรณี ดังนั้นดูเหมือนว่าคุณไม่ได้มีข้อเท็จจริงของคุณตรง
iconoclast

ขึ้นอยู่กับสิ่งที่คุณติดตั้งเป็น / bin / sh ถ้า / bin / sh ทุบตีแสดงว่าคุณพูดถูก ไม่เช่นนั้น bash จะไม่มีข้อได้เปรียบนี้ หาก zsh คือ / bin / sh, zsh มีข้อได้เปรียบนี้ ด้วยเชลล์ที่แตกต่างกันทั้งหมดที่สามารถให้ / bin / sh ได้ฉันขอแนะนำให้คุณใช้เชลล์ที่คุณต้องการสำหรับเชลล์สคริปต์เพื่อที่ว่ามันจะชี้ไปที่ปัญหาที่มีการแก้ไขที่ชัดเจนมากกว่าพฤติกรรมที่แปลกประหลาดโดยไม่มีเงื่อนงำเกี่ยวกับวิธีการ แก้ไข
Ed Grimm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.