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

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

1
zsh ไม่สามารถอินพุตไปยังเทอร์มินัลเมื่อวาง stdin และ stdout ด้วยคำสั่งตัวแปรที่มีเอาต์พุต tty
ข้อมูลระบบ: macOS Sierra 10.12.6 zsh 5.4.2 (x86_64-apple-darwin16.7.0) GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0) เลื่อนไปที่ตัวอย่างที่ด้านล่างหากคุณเพียงต้องการขุดตัวอย่างง่าย ๆ ที่ฉันทำ หมายเหตุ: ฉันไม่ใช่zshผู้ใช้ที่ยิ่งใหญ่ ฉันกำลังมองหาfzfปุ่มลัดสำหรับbashและzsh. $(__fzfcmd)แจ้งให้ทราบว่าพวกเขาทั้งสองเรียกใช้คำสั่งตัวแปร __fzfcmdโดยเอาต์พุตดีฟอลต์fzfไปยัง stdout และการแทนที่พารามิเตอร์เพิ่งรัน command ( fzf) ซึ่งเป็นผลมาจากเอาต์พุต หนึ่งความแตกต่างระหว่างbashและzshสคริปต์เป็นที่bashหนึ่งต่อท่อส่งออกของ$(__fzfcmd)แต่zshเพียงแค่จับมันไว้ภายในอาร์เรย์ ฉันเดาว่าเป็นเพราะปัญหาzshเมื่อคุณไปป์ไลน์เอาท์พุทของfzfที่คุณไม่สามารถป้อนข้อมูลfzfและกระบวนการไพพ์ไปยังโดยfzfไม่ได้รับ stdin ใด ๆ ทางเลือกเดียวของคุณคือการหรือ^Z ดูเหมือนจะเป็นพื้นหลังกระบวนการด้วยเหตุผลบางอย่าง หรือบางทีพวกเขาแค่ต้องการแถวลำดับเพื่อที่จะได้วิ่งต่อไป รุ่นไม่มายากลบางอย่างในกุญแจสำคัญที่มีผลผูกพันกับ^C^Czle vi-fetch-historybash"\e^": history-expand-line ตอนนี้fzfไม่สำคัญ ดูเหมือนว่าคุณเพียงแค่ต้องใช้โปรแกรมที่ให้ผลลัพธ์ที่ttyจะเรียกโดยการทดแทนพารามิเตอร์เพื่อทำให้เกิดปัญหานี้ ดังนั้นฉันจะแสดงตัวอย่างที่ง่ายขึ้น ต่อไปนี้เป็นคำสั่งอื่น ๆ ที่ให้ผลลัพธ์ttyซึ่งอาจทำให้เกิดปัญหานี้ได้zsh: vipe (เรียกใช้เครื่องมือแก้ไขกลางท่อ) 'vim -' (ทำให้เป็นกลุ่มอ่านจาก stdin คล้ายกับ …
11 bash  zsh  pipe  tty 

1
รายการชื่อของสมนามฟังก์ชันและตัวแปรใน zsh
ฉันต้องการวิธีที่จะแสดงชื่อ (โดยไม่มีเนื้อหา / เนื้อหา / ค่า) ของนามแฝง, ฟังก์ชั่น, ตัวแปร, อาร์เรย์ใน zsh มันควรมีพฤติกรรมที่เหมาะสมเช่นcompgen: compgen -a # will list all the aliases you could run. compgen -A function # will list all the functions you could run. compgen -A variable # will list all the variables defined. พื้นหลัง ฉันต้องการสิ่งนี้เพื่อพัฒนา env_parallel.zsh: https://www.gnu.org/software/parallel/env_parallel.html
11 shell  zsh 

4
zsh และ mksh ไม่สามารถใช้ร่วมกับ bash ได้
เชลล์อื่นที่ทำงานร่วมกันได้ของ POSIX สามารถทำงานแทนกันได้อย่างเหมาะสมสำหรับทุบตีอย่างไร พวกเขาไม่จำเป็นต้องแทนที่ "drop-in" จริง แต่ใกล้พอที่จะทำงานกับสคริปต์ส่วนใหญ่และสนับสนุนส่วนที่เหลือด้วยการปรับเปลี่ยนบางอย่าง ฉันต้องการมีสคริปต์ทุบตีอย่างชัดเจน - initscripts, สคริปต์ไคลเอนต์ DHCP และอื่น ๆ - ทำงานด้วยการปรับเปลี่ยนเล็กน้อย ฉันต้องการคอลเลกชันของเชลล์สคริปต์พิเศษที่ไม่ต้องการการดัดแปลงมากเกินไป ฉันต้องการมีคุณสมบัติเช่นการจัดการสตริงและการจับคู่รูปแบบ regex ในตัว คู่แข่งที่ร้ายแรงเท่านั้นที่ฉันรู้จักคือ zsh และ mksh ดังนั้นสำหรับพวกคุณที่นี่ที่ดีทั้งหรือทั้งสอง: bash มีคุณสมบัติใดบ้างที่ zsh และ mksh ตามลำดับไม่มี? คุณสมบัติใดที่เชลล์ใช้ร่วมกับ bash แต่ใช้ไวยากรณ์ที่เข้ากันไม่ได้
11 bash  zsh  mksh 

1
ผูกลำดับคีย์เพื่อ Escape, zsh
ฉันจะจับคู่jjกับEscใน zsh ได้อย่างไร ฉันพยายามสร้างการแมปคีย์ที่ฉันได้ติดตั้งเป็นกลุ่มซึ่งฉันได้jjแมปไปESCดังนั้นเมื่อใดก็ตามที่ฉันกดสองครั้งjมันจะส่งการ<Esc>เรียกเป็นกลุ่ม - ทำให้ฉันเข้าสู่โหมดปกติได้สะดวกยิ่งขึ้น ฉันได้ลองไปแล้วbindkey 'jj' ^[และฉันกำลังจะลองbindkey 'jj' ^[[แต่ฉันสงสัยว่ามันจะใช้งานได้ ฉันยังตรวจสอบรายการของคำสั่งที่ให้บริการโดย zsh ในโหมดปกติ แต่ผมไม่เห็นอะไรที่มีหรือnormalescape หมายเหตุตัวละครในของฉันไฟล์ที่เกิดขึ้นจริงหนีเขียนยาก; ไม่ใช่แค่ตัวละครและ. ^[~/.zshrc^[

2
คุณจะสร้าง RPROMPT ใน zsh ได้อย่างไรเมื่ออัพเดททุกครั้ง
ฉันRPROMPTถูกตั้งค่าให้แสดงข้อมูล SVN vcs_infoใช้ RPROMPT=${vcs_info_msg_0_}มันอ่าน เรียกว่าใช้vcs_info precmd()อย่างไรก็ตาม RPROMPT จะไม่อัปเดตเมื่อฉันเปลี่ยนไดเรกทอรี มันทำงานได้ก็ต่อเมื่อฉันเรียกใช้พรอมต์อีกครั้ง (โดยแหล่งที่มา ~ / .zshrc หรือพรอมต์) และจะไม่เปลี่ยนแปลงตาม chdir เว้นแต่ว่าฉันจะเรียกใช้พรอมต์อีกครั้ง มีวิธีใดบ้างที่จะเปลี่ยนพฤติกรรมนี้

2
ฉันจะกำหนดค่าให้เสร็จสมบูรณ์ zsh เพื่อแสดงไฟล์และโฟลเดอร์ที่ซ่อนอยู่ได้อย่างไร?
ขณะนี้เมื่อฉันขอให้เสร็จพฤติกรรมที่เป็นเช่นนี้: % cd ~/<TAB> Completing directory Desktop/ Downloads/ Pictures/ system/ Videos/ Documents/ Music/ Public/ Templates/ www/ ฉันจะกำหนดค่าความสมบูรณ์ให้กับรายการไฟล์ที่ซ่อนได้อย่างไร
11 zsh  autocomplete 

2
16 สีใน ZShell
ฉันดูเหมือนจะสามารถเรียก 8 สีในพร้อมท์ zshell ของฉัน ตัวอย่าง: PROMPT="[%n@%{$fg[magenta]%}%m%{$reset_color%} %.] %# " ทำงานได้ดี อย่างไรก็ตาม PROMPT="[%n@%{$fg[brmagenta]%}%m%{$reset_color%} %.] %# " ใช้งานไม่ได้ โดยทั่วไปจะไม่มีการเปลี่ยนแปลงของสี "สว่าง" หลังจากทำการวิจัยบางอย่างฉันพบว่าสีของ zsh ถูกเรียกโดย setopt "colours" การทำ echo ${(o)color} ให้ผลลัพธ์นี้: 00 01 02 03 04 05 07 08 22 23 24 25 27 28 30 30 30 30 31 31 32 32 …
11 terminal  zsh  colors 

1
ฉันจะทำให้ฟังก์ชั่นเชลล์ของฉันใช้ประโยชน์จากการเติมข้อความอัตโนมัติที่มีอยู่ใน zsh ได้อย่างไร
ฉันมีฟังก์ชั่นเชลล์สองแบบที่กำหนดไว้ใน.zshrcบันทึกซึ่งพิมพ์และอนุญาตให้รวมกับหน้าจอ ตัวอย่างเช่น: function s() { screen -t "$1" ssh "$@" } อย่างไรก็ตามเมื่อฉันใช้ฟังก์ชั่นเชลล์เหล่านี้ฉันไม่สามารถใช้ประโยชน์จากคุณลักษณะการสร้างคำสั่งของ zsh ได้อย่างสมบูรณ์ (ในกรณีของ SSH ให้กรอกชื่อโฮสต์โดยอัตโนมัติตามที่รู้จักกันว่า host_hosts และ ssh_config) วิธีที่ต้องการในการเชื่อมโยงไปยังกลไกความสมบูรณ์ที่มีอยู่สำหรับคำสั่งที่ฉันสร้าง wrappers คืออะไร แก้ไข: ขอบคุณ Gilles สำหรับคำตอบของเขาด้านล่าง การใช้ compdef ดูเหมือนจะเป็นวิธีการทำเช่นนี้ แต่น่าสนใจว่ามันไม่ทำงานอย่างสม่ำเสมอ ในกรณีนี้ฉันมีการตั้งค่าต่อไปนี้: function s() { screen -t "$1" ssh "$@" } function m() { screen -t "man.$1" man "$1" } …
10 zsh  autocomplete 

4
“ ไม่พบคำสั่ง” เมื่อฟังก์ชั่น sudo'ing จาก ~ / .zshrc
ฉันมีฟังก์ชั่นใน~/.zshrc: findPort() { lsof -t -i :$1 } findPort 3306ภาวนาตามปกติคือ ฉันต้องการเรียกใช้ด้วยสิทธิ์ระดับสูง แต่ฉันได้รับ "ไม่พบคำสั่ง" ➜ git 🍔 sudo findPort 3306 sudo: findPort: command not found ผมเข้าใจเหตุผลก็คือผู้ใช้รากทั้งวิ่งเป็นเปลือกไม่โต้ตอบ (จึงไม่ได้หมายถึง .zshrc) หรือหมายถึงแตกต่างกัน .zshrc ฉันได้เห็นคำถามที่คล้ายกันเกี่ยวกับaliasแต่ไม่มีคำถามเกี่ยวกับฟังก์ชั่นที่ผู้ใช้กำหนด คำตอบสำหรับปัญหานี้aliasเกี่ยวข้องกับการเพิ่มนามแฝงไปที่~/.zshrc: alias sudo='nocorrect sudo ' หรือบางที: alias sudo='sudo ' ฉันลองทั้งสองวิธีแล้วและปัญหายังคงมีอยู่ (ใช่ฉันเปิดตัวเชลล์ใหม่) ฉันได้ลองใช้งานsudo chshเพื่อให้แน่ใจว่าเชลล์รูทของฉันทำงานzshได้ ไม่มีวิธีการแก้ปัญหาเหล่านี้ลบปัญหา "คำสั่งไม่พบ" มีวิธีเรียกใช้ฟังก์ชันที่ผู้ใช้กำหนดเองภายใต้ sudo หรือไม่
10 sudo  zsh 

5
การใช้การขยายพารามิเตอร์เพื่อสร้างรายการอาร์กิวเมนต์สำหรับ `mkdir -p`
ฉันมีสิ่งนี้: % ls -1dF /tmp/foo/* /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/ /tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/ /tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/ . . . /tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/ /tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/ /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/ ฉันต้องการที่จะสร้างไดเรกทอรีภายใต้แต่ละไดเรกทอรีย่อยที่อยู่ภายใต้barfoo ถ้าฉันลองทำสิ่งนี้ด้วย % mkdir -p /tmp/foo/*/bar ... ฉันได้รับข้อผิดพลาด zsh: no matches found: /tmp/foo/*/bar (ในการเข้าใจย้อนหลังฉันสามารถเข้าใจเหตุผลสำหรับข้อผิดพลาด) ฉันรู้ว่าฉันสามารถแก้ปัญหาเดิมด้วย for-loop ได้ แต่ฉันอยากรู้ว่าzshสนับสนุนการขยายพารามิเตอร์บางรูปแบบที่จะสร้างอาร์กิวเมนต์ที่ต้องการสำหรับการเรียกใช้ครั้งเดียวmkdir -pหรือไม่ IOW การขยายพารามิเตอร์เทียบเท่ากับ "ผนวก/barกับทุกส่วนนำหน้าที่สร้างโดยการขยาย/tmp/foo/*" ทำให้ % mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
10 zsh 

4
เหตุใดการตัดจึงล้มเหลวด้วยการทุบตีและไม่ zsh
ฉันสร้างไฟล์ที่มีฟิลด์คั่นด้วยแท็บ echo foo$'\t'bar$'\t'baz$'\n'foo$'\t'bar$'\t'baz > input ฉันมีสคริปต์ชื่อต่อไปนี้ zsh.sh #!/usr/bin/env zsh while read line; do <<<$line cut -f 2 done < "$1" ฉันทดสอบมัน $ ./zsh.sh input bar bar มันใช้งานได้ดี อย่างไรก็ตามเมื่อฉันเปลี่ยนบรรทัดแรกเพื่อเรียกใช้bashแทนจะล้มเหลว $ ./bash.sh input foo bar baz foo bar baz ทำไมสิ่งนี้ถึงล้มเหลวbashและทำงานกับzsh? การแก้ไขปัญหาเพิ่มเติม การใช้เส้นทางตรงใน shebang แทนที่จะenvสร้างพฤติกรรมแบบเดียวกัน ไปป์กับechoแทนที่จะใช้ที่นี่สตริง<<<$lineยังสร้างลักษณะการทำงานเดียวกัน echo $line | cut -f 2กล่าวคือ ใช้awkแทนการcut …

3
วิธีใช้“ เครื่องกำเนิดไฟฟ้า” เช่น $ RANDOM ได้อย่างไร
ตัวแปรพิเศษ$RANDOMมีค่าใหม่ทุกครั้งที่เข้าถึง ในแง่นี้มันชวนให้นึกถึงวัตถุ "เครื่องกำเนิด" ที่พบในบางภาษา มีวิธีที่จะใช้บางสิ่งเช่นนี้zshหรือไม่? ฉันพยายามทำสิ่งนี้ด้วยไพพ์ที่มีชื่อ แต่ฉันไม่พบวิธีที่จะแยกไอเท็มจาก Fifo ในลักษณะที่ควบคุมได้โดยไม่ต้องฆ่ากระบวนการ "ตัวสร้าง" ตัวอย่างเช่น: % mkfifo /tmp/ints % (index=0 while ( true ) do echo $index index=$(( index + 1 )) done) > /tmp/ints & [1] 16309 % head -1 /tmp/ints 0 [1] + broken pipe ( index=0 ; while ( true; ); …
10 zsh  fifo  ipc 

2
แทนที่กระบวนการปัจจุบันด้วยกระบวนการ / กระบวนการลูก
ฉันมีโปรแกรมPที่คาดว่าจะได้รับ "สวัสดี" และส่งออก "ทำไม" ก่อนที่จะให้คุณสมบัติ คุณลักษณะนี้ใช้งานโดยโปรแกรมอื่นที่ไม่ทราบว่ามันเป็นมารยาททั่วไปในการเริ่มการสนทนากับ "Hello" ฉันจึงต้องการเขียน wrapper สำหรับPที่ทำงานเช่นนี้ (ไวยากรณ์ zsh): coproc P print -p Hello # Send Hello to P read -pr line # Read what P has to say [[ "$line" = "Why?" ]] && Replace current process with the coprocess. echo Could not get P's attention. …
10 shell  scripting  process  zsh 

4
ฉันสามารถอ้างอิงคำสั่งก่อนหน้า '&&' หลังจาก '&&' ได้หรือไม่
ไม่แน่ใจว่าจะใช้วลีคำถามนี้อย่างไร แต่โดยทั่วไปฉันมักจะพบว่าตัวเองกำลังรันคำสั่งที่ต้องการvagrantเพิ่มค่า VM และจากนั้นจึงใช้ ssh เหมือนด้านล่าง: vagrant up && vagrant ssh ขาดการเขียนฟังก์ชั่นหรือสคริปต์ของตัวเองมีวิธี "นำ" vagrantส่วนที่ใช้ในส่วนที่สองของคำสั่งหรือไม่
10 bash  zsh 

2
ส่งสำเนาของเอาต์พุตสคริปต์ไปยังไฟล์
สมมติว่าฉันมีสคริปต์ Zsh และฉันต้องการให้มันพิมพ์ผลลัพธ์ไปSTDOUTยัง แต่ก็คัดลอก (ดัมพ์) เอาต์พุตไปยังไฟล์ในดิสก์ ยิ่งกว่านั้นสคริปต์เริ่มต้นด้วยตัวเลือกต่อไปนี้ set -o xtrace ซึ่งบังคับให้มันเป็น verbose และพิมพ์คำสั่งที่มันทำงาน ฉันต้องการที่จะจับเอาท์พุทนี้เช่นกันในไฟล์ในดิสก์ ความเข้าใจของฉันคือถ้าฉันทำ ./my_script.sh > log.txt มันจะส่งSTDOUTไปlog.txtแต่ถ้าฉันต้องการที่จะเห็นเอาท์พุทใน terminal? ฉันได้อ่านเกี่ยวกับteeและMULTIOSตัวเลือกใน zsh แต่ฉันไม่แน่ใจว่าจะใช้พวกเขา เมื่อฉันทำ: ./my_script | tee log.txt ฉันสามารถเห็นผลลัพธ์บนเทอร์มินัล แต่ไฟล์ไม่log.txtเห็นว่าจะจับทุกอย่าง (อันที่จริงมันเก็บแทบทุกอย่าง)

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