คำถามติดแท็ก zsh

Zsh เป็นเชลล์ที่มีคุณสมบัติบรรทัดคำสั่งและสคริปต์ขั้นสูงมากมาย

1
zsh - ขยายพา ธ ไบนารีแบบเต็มบน <tab>
ในพฤติกรรม zsh ปัจจุบันของฉันกดปุ่มแท็บหลังจากพิมพ์ "sudo" เพียงแค่เพิ่มช่องว่าง $ sudo ... สิ่งที่ฉันต้องการคือให้แท็บขยายอย่างเต็มที่ไปยังเส้นทางของไบนารีที่จะดำเนินการเมื่อฉันกดแท็บทำให้ฉันเห็นสิ่งที่จะทำงาน: $ /usr/bin/sudo ... เป้าหมายคือเพื่อป้องกันกรณีที่ผู้ใช้ในเครื่องของฉันถูกแฮกรายการที่เพิ่มลงใน$PATHตัวแปรของฉันและ 'sudo' เรียกใช้โปรแกรมที่เป็นอันตราย
10 zsh  path  autocomplete 

3
ปัญหาหลักที่คนย้ายจากทุบตีไป zsh ควรเผชิญคืออะไร?
สองสามครั้งที่ฉันมีปัญหาในการทุบตีที่คนอื่นใช้ zsh ไม่ได้และพวกเขาก็มองด้วยความดีใจว่าพวกเขาฉลาดแค่ไหน นอกจากนี้ฉันยังเห็นผู้ใช้ zsh ในหมู่คนที่ฉันชื่นชมและฉันได้ลองสองสามครั้งครึ่งใจที่จะย้ายไป zsh แต่ทุกครั้งที่กลับมาเพราะฉันไม่มีเวลา (และขี้เกียจ) เพื่อเรียนรู้การทำงานประจำใน zsh มีเครื่องมือสำหรับการโยกย้ายที่ใช้งานได้จริงหรือไม่? หรือมีบางสิ่งที่สำคัญที่คุณอยากจะแนะนำให้ฉันเรียนรู้เพื่อทำให้การเปลี่ยนแปลงง่ายขึ้นอย่างน้อยก็เพื่อที่ฉันจะได้ลองและดูว่ามันสร้างความแตกต่าง "สำหรับฉัน" หรือไม่? โดยวิธีการที่ฉันใช้จ่ายส่วนใหญ่ของชีวิตของฉันกับ mac, Ubuntu และ RedHat
10 bash  zsh 

2
แถบสถานะหน้าจอเพื่อแสดงไดเร็กทอรีปัจจุบันสำหรับ zsh / bash เชลล์
ฉันใช้หน้าจอ GNU กับ zsh เป็นจำนวนมาก มันจะเป็นคุณสมบัติที่ดี (ฉันคิดว่า) เพื่อให้สามารถแสดงชื่อไดเรกทอรีปัจจุบัน (ไม่ใช่เส้นทางแบบเต็ม) เป็นชื่อแท็บ ฉันสามารถทำได้ด้วยCTRL+A SHIFT+Aแต่นั่นคือคู่มือ ฉันต้องการให้มันเปลี่ยนทุกครั้งที่ฉันเปลี่ยนไดเรกทอรี ไม่มีใครรู้วิธีการทำเช่นนี้? แก้ไข: คำตอบยังมีโซลูชันสำหรับทุบตี
10 bash  zsh  gnu-screen 

1
การตัดคำสั่งที่มีเครื่องหมายคำพูดเดี่ยวและคู่สำหรับคำสั่งอื่น
ฉันเพิ่งเรียนรู้เกี่ยวกับนาฬิกาแต่ฉันมีปัญหาในการทำให้มันทำงานกับคำสั่งที่ค่อนข้างซับซ้อน ตัวอย่างเช่นฉันต้องการขอwatchให้เรียกใช้คำสั่งต่อไปนี้zshทุกสามวินาที* : for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done ดังที่คุณเห็นบรรทัดด้านบนมีเครื่องหมายคำพูดเดี่ยวเครื่องหมายคำพูดคู่และอักขระพิเศษอื่น ๆ ดังนั้นฉันจึงพยายาม: watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done" แต่แล้วฉันได้: ไม่พบข้อมูลที่ตรงกับ x in! @ # $ …
10 shell  zsh  quoting 

1
ทำไมฉันไม่สามารถพิมพ์ตัวแปรที่ฉันเห็นได้ในผลลัพธ์ของ env
ฉันสนใจที่จะตั้งค่าตัวแปรสภาพแวดล้อมของเชลล์อินสแตนซ์หนึ่งจากอีกอันหนึ่ง ฉันจึงตัดสินใจทำการวิจัย หลังจากอ่านคำถามจำนวนหนึ่งเกี่ยวกับเรื่องนี้ฉันตัดสินใจที่จะทดสอบ ผมสองกระบอกเปลือกหอย A และ B (PID 420) zshทั้งการทำงาน จาก AI เชลล์วิ่งต่อไปนี้ sudo gdb -p 420 (gdb) call setenv("FOO", "bar", 1) (gdb) detach จาก shell B เมื่อฉันรันenvฉันเห็นตัวแปร FOO ถูกตั้งค่าด้วยค่าบาร์ นี่ทำให้ฉันคิดว่า FOO ได้รับการเริ่มต้นได้สำเร็จในสภาพแวดล้อมของ shell B อย่างไรก็ตามถ้าฉันพยายามพิมพ์ FOO ฉันจะได้รับบรรทัดว่างซึ่งหมายความว่าไม่ได้ตั้งค่าไว้ สำหรับฉันมันรู้สึกเหมือนมีความขัดแย้งที่นี่ สิ่งนี้ได้รับการทดสอบทั้งในระบบ Arch GNU / Linux ของฉันและ Ubuntu VM ฉันยังทดสอบสิ่งนี้bashว่าตัวแปรไม่ได้แสดงใน env แม้ว่ามันจะน่าผิดหวังสำหรับฉัน …

4
การขยายตัวของค้ำยันจากขวาไปซ้าย
ใน zsh (และเชลล์อื่น ๆ ) ถ้าฉันมีอาร์กิวเมนต์เช่น (ตัวอย่าง): {a,b,c}{d,e,f} การขยายรั้งเปลี่ยนเป็น: ad ae af bd be bf cd ce cf สำหรับวัตถุประสงค์ของฉันลำดับการโต้แย้งมีความสำคัญและฉันต้องการเครื่องมือจัดฟันเพื่อขยายจากขวาไปซ้ายแทนซ้ายไปขวา นั่นคือฉันต้องการขยายตัวเป็น: ad bd cd ae be ce af bf cf มีวิธีควบคุมลำดับของการจัดฟันหลายชุดหรือไม่? ฉันกำลังมองหาบางสิ่งบางอย่างที่จะทำงานในสถานการณ์ใด ๆ ไม่เพียง แต่มีข้อโต้แย้งเหล่านี้

2
ลำดับความสำคัญของ && vs & ใน bash และ zsh
ตอบคำถามนี้ฉันค้นพบความแตกต่างที่ตลกมาก (และบอบบาง) ระหว่างพฤติกรรมในbashและzsh: ในbash: romano@RRyS:~$ pwd /home/romano romano@RRyS:~$ alias x="cd /bin &amp;&amp; ./echo A &gt;/dev/null &amp;" romano@RRyS:~$ x [1] 16611 romano@RRyS:~$ pwd /home/romano อย่างที่คุณเห็นการดำเนินการของนามแฝงxจะดำเนินการใน subshell ดังนั้นไดเรกทอรีปัจจุบันจะไม่เปลี่ยนแปลง ไม่อยู่ในzsh: [romano:~] % pwd /home/romano [romano:~] % alias x="cd /bin &amp;&amp; ./echo A &gt;/dev/null &amp;" [romano:~] % x [1] 16744 [1] + 16744 done …
9 bash  shell  zsh 

3
ฉันจะตั้งค่ากฎการเติมข้อความอัตโนมัติ Zsh สำหรับอาร์กิวเมนต์ที่สอง (ฟังก์ชัน) เป็นกฎของคำสั่งที่มีอยู่ได้อย่างไร
ฉันมีฟังก์ชั่น Zsh ที่กำหนดเองg : function g() { # Handle arguments [...] } ภายในนั้นฉันจัดการกับข้อโต้แย้งสั้น ๆ ที่เรียกใช้คำสั่ง Git ตัวอย่างเช่น: g ls # Executes git ls-files ... g g # Executes git grep ... ฉันต้องสามารถตั้งค่ากฎการเติมข้อความอัตโนมัติให้เป็นกฎของ Git สำหรับข้อโต้แย้งสั้น ๆ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร ตัวอย่างเช่นฉันต้องg ls &lt;TAB&gt;แท็บทำตามกฎgit ls-files &lt;TAB&gt;ซึ่งจะทำให้ฉันมีข้อโต้แย้งสำหรับgit ls-files: $ g ls --&lt;TAB&gt; --abbrev -- set minimum …
9 zsh  autocomplete  git 

1
Zsh auto complete แนะนำฟังก์ชั่นที่สมบูรณ์ (_git _vim ฯลฯ )
ฉันมีความรำคาญเล็กน้อยกับวิธีการzshทำคำแนะนำที่สมบูรณ์สำหรับคำสั่งของฉัน หากฉันพิมพ์จุดเริ่มต้นของคำสั่งที่ฉันยังไม่ได้ติดตั้งและกดtabมันจะแนะนำฟังก์ชันความสมบูรณ์ที่ติดตั้ง ช่วยบอกว่าผมต้องการที่จะดำเนินการแต่ก็ไม่ได้ติดตั้งก็จะแนะนำvim_vim มีวิธีปิดหรือไม่ หรือฉันทำอะไรผิดพลาดในการตั้งค่าของฉัน? ทั้งหมด dotfiles github.com/henrikbjorn/castleของฉันอยู่ในที่สาธารณะ

1
ls -l - กลุ่มไดเรกทอรีแรก (ดำเนินการกับ symlink ด้วย)
lsตัวเลือก--group-directories-firstทำให้ไดเรกทอรีที่จะแสดงรายการอยู่ด้านบนซึ่งทำให้การส่งออกของlsดีและสะอาด: ls -l --group-directories-first อย่างไรก็ตามมันไม่ได้ดำเนินการกับsymlinksซึ่งเป็นsymlinksไดเรกทอรีจริงๆ มีความเป็นไปได้ที่จะใช้เป็น ls -l -L --group-directories-first ซึ่งจะแสดงรายการทั้งสองประเภทของไดเรกทอรีที่ด้านบน แต่จะไม่แยกความแตกต่างระหว่างไดเรกทอรีที่เหมาะสมและไดเรกทอรี symlinked ซึ่งทำให้เกิดความสับสนอีกครั้ง สามารถlsแสดงไดเรกทอรี symlinked ด้านบนในขณะที่ยังคงแตกต่างจากไดเรกทอรีปกติได้หรือไม่ แก้ไข:bashฉันใช้
9 bash  zsh  directory  ls  symlink 

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

2
ฉันจะหยุดทุบตีจากการตรวจสอบไวยากรณ์ที่มาไฟล์ได้อย่างไร
ฉันมีรหัสต่อไปนี้ในไฟล์ที่มาจากทั้ง zsh และ bash if test $SHELLNAME = zsh ; then lss() { l -l ${1:-.}/*(s,S,t); } laf() { l ${1:-.}/.*(.); } lad() { l -d ${1:-.}/.*(/); } lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); } fi SHELLNAMEคือzshถ้าเปลือกเป็น zsh และbashถ้าเปลือกเป็นทุบตี แต่ละฟังก์ชั่นด้านบนมีรหัสที่ใช้งานได้กับ zsh แต่ไม่ใช่การทุบตี เมื่อฉันส่งไฟล์นี้มาฉันได้รับข้อผิดพลาดดังต่อไปนี้ bash: &lt;filename&gt;: line 67: syntax error near unexpected …
9 bash  zsh 

1
ฉันจะสร้างฟังก์ชั่นใน zsh ที่เรียกคำสั่งที่มีอยู่ด้วยชื่อเดียวกันได้อย่างไร?
ฉันจะเขียนฟังก์ชั่นในzshที่เรียกคำสั่งที่มีอยู่ด้วยชื่อเดียวกันกับฟังก์ชั่นได้อย่างไร ตัวอย่างเช่นฉันได้ลองทำสิ่งนี้เพื่ออธิบายคำถามของฉัน: function ls { ls -l $1 $2 $3 } เมื่อฉันรันด้วยls *ฉันได้รับต่อไปนี้: ls:1: maximum nested function level reached ฉันคิดว่านี่เป็นเพราะฟังก์ชั่นจะถูกเรียกซ้ำ ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร นี่เป็นตัวอย่างที่หยาบคายและในกรณีนี้นามแฝงจะทำงาน แต่ฉันมีตัวอย่างที่ซับซ้อนกว่าที่นามแฝงไม่เหมาะและดังนั้นฉันจะต้องเขียนฟังก์ชัน
9 zsh  function 

3
Zsh: แก้ไขคำสั่งที่ดำเนินการโดยอัตโนมัติ
ฉันเพิ่งติดตั้ง grc (colorizer ทั่วไป) ไปยังระบบของฉันผ่าน MacPorts ทำให้ฉันมีความสามารถในการรับเอาต์พุต colorized สำหรับคำสั่งมากมายซึ่งโดยค่าเริ่มต้นไม่รองรับ (ดูภาพด้านล่าง) ฉันต้องการใช้ grc แบบอัตโนมัติ แต่ไม่ใช่สำหรับคำสั่งเฉพาะ แต่สำหรับทุกคำสั่ง ฉันใช้ zsh เป็นเปลือกของฉัน โดยเฉพาะอย่างยิ่งเมื่อใดก็ตามที่ผมดำเนินการผมอยากให้มีการดำเนินการโดยอัตโนมัติเป็นcommand -parameter 1 2 3 ฉันไม่ได้ต้องการใช้นามแฝงเช่นนามแฝงถึงเนื่องจากฉันกำลังเพิ่มคำสั่งเพิ่มเติมเพื่อให้ grc เปลี่ยนสีgrc command -parameter 1 2 3traceroutegrc traceroute ฉันดูการกำหนดค่า preexec และ precmd สำหรับ. zshrc แต่ฉันไม่พบวิธีที่จะบรรลุสิ่งที่ฉันกำลังมองหา
9 terminal  zsh  osx 

1
วิธีที่ดีที่สุดในการตรวจจับ (จากสคริปต์) ว่าติดตั้งซอฟต์แวร์คืออะไร?
ฉันเคยผิดหวังมาก่อนด้วยความแตกต่างของเอาต์พุตจากwhichคำสั่งข้ามแพลตฟอร์มที่แตกต่างกัน (Linux กับ Solaris vx. OS X) ด้วยกระสุนที่แตกต่างกันอาจจะเล่นในเรื่องนี้เช่นกัน typeได้รับการแนะนำว่าเป็นทางเลือกที่ดีกว่า แต่มันจะเป็นแบบพกพาได้อย่างไร ในอดีตฉันได้เขียนฟังก์ชั่นซึ่งแยกวิเคราะห์ผลลัพธ์whichและจัดการกรณีการใช้งานที่แตกต่างกันที่ฉันพบ พวกเขาทำงานในเครื่องที่ฉันใช้และก็โอเคสำหรับสคริปต์ส่วนตัวของฉัน แต่ดูเหมือนว่าไม่น่าเชื่อถืออย่างยิ่งสำหรับซอฟต์แวร์ที่ฉันจะโพสต์ที่อื่นเพื่อให้ผู้อื่นใช้ ในการใช้ตัวอย่างที่เป็นไปได้เพียงอย่างเดียวสมมติว่าฉันต้องตรวจจับจากสคริปต์ว่า bash และ zsh มีอยู่ในเครื่องหรือไม่จากนั้นเรียกใช้คำสั่งด้วย zsh หากมีอยู่และทุบตีถ้า zsh ไม่ได้และ bash นั้นเพียงพอ เวอร์ชันที่ไม่มีข้อผิดพลาดเฉพาะ ส่วนที่เหลือของสคริปต์อาจเป็น Bourne shell หรือ Ruby หรืออย่างอื่น แต่สิ่งนี้สิ่งหนึ่งที่ต้องทำ (AFAIK) ด้วย zsh หรือ bash เวอร์ชันล่าสุด ฉันสามารถนับtypeได้ว่ามีอยู่ในแพลตฟอร์มหรือไม่ มีทางเลือกอื่นwhichที่สามารถตอบคำถามได้อย่างง่ายดายและต่อเนื่องว่ามีการติดตั้งซอฟต์แวร์บางส่วนหรือไม่? (ถ้าคุณต้องการให้ความคิดที่เกี่ยวข้องกับตัวอย่างที่ฉันให้มาโดยเฉพาะนั้นยอดเยี่ยม แต่ฉันแค่ถามถึงกรณีทั่วไป: วิธีที่น่าเชื่อถือที่สุดในการตรวจสอบว่ามีการติดตั้งสิ่งใดในเครื่องที่กำหนดหรือไม่ ?)
9 bash  zsh  standard  which 

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