คุณลักษณะใดบ้างที่อยู่ใน zsh และหายไปจาก bash หรือในทางกลับกัน


62

ในฐานะผู้ใช้ Linux ฉันมักจะใช้ bash เสมอเพราะเป็นค่าเริ่มต้นสำหรับทุก distro ที่ฉันใช้ คนที่ใช้ระบบ Unix อื่น ๆ เช่น BSD ดูเหมือนจะใช้เชลล์ตัวอื่นบ่อยกว่า เพื่อความสนใจในการเรียนรู้มากขึ้นฉันตัดสินใจลอง zsh

ในฐานะผู้ใช้ทุบตี:

  • ฉันจะพลาดฟีเจอร์อะไร
  • และฉันควรระวังสิ่งใด


5
@Gilles สักวันมันคงจะดีถ้ามีคนย้ายทั้งหมดที่นี่ ... และรวมเข้าด้วยกัน
xenoterracide

คำตอบ:


45

มีการทำกิจกรรมค่อนข้างน้อยในหัวข้อในไซต์ Stack Exchange อื่น ๆ ประสบการณ์ของฉันในการเปลี่ยนจาก bash เป็น zsh เท่าที่จำได้ (เมื่อหลายปีก่อน²) คือฉันไม่ได้พลาดอะไรเลย ฉันได้รับมาก นี่คือสิ่งที่ฉันคิดว่าเป็นคุณสมบัติเฉพาะ zsh ที่ฉันใช้บ่อยที่สุด:

  • คุณสมบัติ zsh ที่ฉันพลาดมากที่สุดเมื่อฉันใช้ bash เป็นครั้งคราวคือ autocd: ใน zsh การเรียกใช้ไดเรกทอรีหมายถึงการเปลี่ยนมันหากคุณเปิดใช้ตัวเลือกนี้autocd

  • คุณสมบัติที่มีประโยชน์มากอีกอย่างหนึ่งก็คือ กราฟฟิคตัวละครเป็นบิตยากที่จะจำ แต่สะดวกมาก (ในขณะที่ก็มักจะเร็วกว่าที่จะมองพวกเขามากกว่าที่จะเขียนเทียบเท่าfindคำสั่ง) ตัวอย่างที่ง่ายกว่า:
        foo*~*.bak= การจับคู่ทั้งหมดfoo*ยกเว้นการจับคู่*.bak
        foo*(.)= การจับคู่ไฟล์ปกติเท่านั้น = การจับคู่foo*
        foo*(/)ไดเรกทอรีเท่านั้นfoo*
        foo*(-@)= การจับคู่ลิงก์สัญลักษณ์ที่ห้อยอยู่เท่านั้นfoo*
        foo*(om[1,10])= 10 ไฟล์ล่าสุดที่ตรงกันfoo*
        foo*(Lm+1)= ไฟล์ที่มีขนาด> 1MB = ในไดเรกทอรีและทั้งหมด ไดเรกทอรีย่อยซ้ำ⁴
        dir/**/foo*foo*dir

  • สำหรับการเปลี่ยนชื่อแฟนซีzmvบิวอินสามารถเป็นประโยชน์ได้ ตัวอย่างเช่นหากต้องการคัดลอกทุกรายการfileไปยังfile.bak:zmv -C '(*)(#q.)' '$1.bak'

  • ทั้ง bash และ zsh มีระบบการเติมเต็มที่เหมาะสมซึ่งจำเป็นต้องเปิดใช้งานอย่างชัดเจน ( . /etc/bash_completionหรือautoload -U compinit; compinit) Zsh's สามารถกำหนดค่าได้มากขึ้นและโดยทั่วไปนักเล่น

หากคุณรัน zsh โดยไม่มี a .zshrcมันจะเริ่มเมนูโต้ตอบที่ให้คุณเลือกตัวเลือกการกำหนดค่า (การกระจายบางคนอาจจะปิดการใช้งานนี้ในกรณีที่ทำงานautoload zsh-newuser-install; zsh-newuser-install.) ฉันขอแนะนำให้เปิดใช้ตัวเลือกประวัติศาสตร์แนะนำเปิด (“สไตล์ใหม่”) แล้วเสร็จและเปิด“ตัวเลือกเปลือกทั่วไป” beepยกเว้น หลังจากนั้นกำหนดค่าตัวเลือกเพิ่มเติมตามที่คุณค้นพบ

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


5
ตอนนี้ Bash 4.0 รองรับautocdคุณสมบัติที่คุณพูดถึงข้างต้น shopt -s autocdเปิดใช้งานคุณลักษณะโดยใช้คำสั่ง จากนั้นคุณลักษณะดังกล่าวจะทำงานตามที่คุณได้อธิบายไว้
Philluminati

zsh ยังมีwhereคำสั่งในตัวเพื่อไม่ให้สับสนกับwhichคำสั่ง
Sildoreth

@EdGrimm ฉันคิดว่า GNU และ FreeBSD find สามารถทำทุกอย่างที่ตัวระบุ zsh glob สามารถทำได้ (มี-execเชลล์สำหรับสิ่งต่าง ๆ เช่นการเลือกด้วยeและไปป์ไลน์เป็นเครื่องมือเช่นsortและsedสำหรับการเขียนใหม่ด้วยeและการเรียงลำดับ) แน่นอนมากขึ้น verbosely
Gilles

หลังจากตรวจสอบและตรวจสอบ manpage ค้นหาใหม่มานานกว่าทศวรรษฉันคิดว่าฉันหยุดดูจริงๆ แต่ถ้าฉันได้ตรวจสอบครั้งสุดท้ายก่อนที่จะแสดงความคิดเห็นฉันจะเห็นอย่างน้อยตัวเลือกขนาดตอนนี้จะนำหน่วยลงไปไบต์
Ed Grimm

11

นอกจากนี้ความสมบูรณ์ของแท็บเริ่มต้นจะดีกว่าทุบตี ... เช่น ...

~/.e.dTAB จะขยายเป็น~/.emacs.d/zsh, bash จะส่งเสียงบี๊บ


มันไม่ได้ setoptคุณใช้ตัวเลือกที่ไม่ใช่ค่าเริ่มต้นสำหรับสิ่งนั้น (ถ้ามี)

ฉันรู้ว่าฉันได้_-.ตั้งเป็นตัวแทน zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' . ดูstackoverflow.com/q/7906078/311660
ocodo

10

zshให้คุณแก้ไขคำสั่งหลายบรรทัด (ดูตัวแก้ไขบรรทัด zsh ), bash ไม่ได้ หากคุณลองใช้เคล็ดลับเดียวกัน ( Ctrl-p) ทุบตีจะดึงคำสั่งสุดท้าย


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

1
ยังไม่ดีเท่านี้ (:
SilverWolf

8

Bash มีคุณสมบัติในการเปิดพอร์ตโดยใช้

/dev/tcp/host/port

หรือ

/dev/udp/host/port

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


5
zsh มี ztcp builtin ซึ่งมีความสามารถมากกว่า bash's / dev / tcp, ไม่มี / dev / udp ฉันต้องการใช้ socat แทน
Stéphane Chazelas

2

ซึ่ง - ปรับปรุงใน zsh

whichคำสั่งในทุบตีเพียงเผยให้เห็นสถานที่ตั้งของคำสั่ง

ใน Zsh whichจะเปิดเผยคำนิยามของalias, แหล่งที่มาสำหรับfunctionและตำแหน่งของคำสั่ง

สมมติว่าเรามีนามแฝงของเชลล์:

alias gg='git log'

ใน Bash ถ้าเราถาม: which ggผลลัพธ์จะเป็นโมฆะ

ใน Zsh: which ggจะให้เรา ...

gg: aliased to git log

สมมติว่าเรามีฟังก์ชั่นเชลล์:

hello() {
    echo "Hello World"
}

ใน Bash ถ้าเราถาม: which helloผลลัพธ์จะเป็นโมฆะ

ใน Zsh: which helloจะให้เรา ...

hello() {
    echo "Hello World"
}

Bash มีฟังก์ชันการทำงานเดียวกันผ่านtypeคำสั่ง (builtin) และเพื่อ nitpick: whichเป็นคำสั่งภายนอกไม่ใช่ทุบตีในตัว
Torkel Bjørnson-Langen


0

zsh - เปลือกที่สมบูรณ์

มีเป็นจำนวนมากอ่านผ่านzshcontrib(1)หนึ่งสามารถตรวจสอบรุ่นที่สองautoloadน่าtetrisเกม (อีกด้วยncurses) ในzshในการแข่งขันกับemacs, เพื่อความสมบูรณ์ (ตามที่อธิบายไว้)

=

ฉันต้องการพูดถึง=คำหลักซึ่งอาจทำให้เกิดการระคายเคืองcurl(มักจะมี URL ?var=valอยู่ในพวกเขา แต่เป็นunsetoptไปได้ที่ฉันคิดว่า):

  • q file =less( gentoo) แก้ไขเป็นq file $(which less)

= ขยายไปยังเส้นทางแบบเต็มของคำสั่งที่เป็นปัญหา

สารพัดอื่น ๆ

สิ่งอื่น ๆ ออกจากใจเป็นสิทธิ์ที่ถูกต้องRPS1=%d(เพื่อแสดง$PWDในรูปแบบ), Alt + H( run-helpเช่น. man), Alt + ? ( which-command) vared, และzed( autoloadฟังก์ชั่น), minibuffer Emacs 'เหมือนที่Alt + Xจะดำเนินการเครื่องมือโดยไม่ต้องผูกพันพวกเขาทั่วโลกและนามแฝงต่อท้าย ติดตามประวัติคำสั่งขยายระยะเวลาการก่อสร้างแล้วเสร็จ-mและ-regexmatchers เปลือกจำลอง (เช่น. csh, kshด้วยemulate) และautoload run-helpมีตัวอย่างแฟ้มสำหรับสร้างอิน

คร่ำครวญ

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

bashดูเหมือนจะกระจายมากขึ้นในreadline(เมื่อเทียบกับzle) และgnu historyในจิตวิญญาณลินุกซ์; เช่นฟังก์ชั่นที่ ReadLine และ keybindings สามารถนำไปใช้ทั่วโลก (รวมทั้งที่เก็บไว้ใน~/.inputrcและ/etc/inputrc) bindหากไม่ได้แทนที่โดยทุบตีเฉพาะ

ข้อสรุป

โดยส่วนตัวฉันคิดว่าemacs(โดยเฉพาะจากความคาดหวังของemacs-noxรสชาติ(ปัจจุบัน) ) เป็นแรงบันดาลใจให้กับซอฟต์แวร์พิเศษที่ชอบzshและtmuxทำงานได้ดีมากในการเป็นตัวอย่างในการนำไปใช้ สำหรับคนที่เห็นคุณค่าของมัน (ในระดับที่ไม่ต้องการ / ขึ้นอยู่กับXเซิร์ฟเวอร์) Unix shell นั้นทรงพลังเพียงพอและความต่อเนื่องและสม่ำเสมอนั้นเพียงพอสำหรับเวิร์กโฟลว์และผลผลิตที่เหมาะสม (ในการคำนวณโดยรวม)

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