การใช้สัญลักษณ์แทนในคำสั่งด้วย zsh


39

ใช้คำสั่งเช่นrsyncและscpกับZSHฉันพบปัญหา แทนที่จะเป็นพฤติกรรม (ปกติ) ของการให้ไฟล์ที่ตรงกันทั้งหมดแก่ฉันมันจะไม่ทำงานและคืนค่า:

  ~  rsync -azP user@server:~/* ~/
zsh: no matches found: user@server:~/*

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

ของฉัน .zshrc

ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
plugins=(git brew)
source $ZSH/oh-my-zsh.sh
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin

คำตอบ:


50

สิ่งนี้เกี่ยวข้องกับวิธีที่ ZSH จัดการกับอักขระตัวกลมเพื่อสร้างชื่อไฟล์ โดยค่าเริ่มต้น ZSH จะสร้างชื่อไฟล์และโยนข้อผิดพลาดก่อนดำเนินการคำสั่งหากพบว่าไม่มีการแข่งขัน

มีหลายวิธีในการหลีกเลี่ยงพฤติกรรมนี้และนี่คือบางส่วน:

  • ที่เร็วที่สุดคือการใส่ตัวละครกลมด้วยคำพูด
$ rsync -azP "user@server:~/*" ~/
  • สำหรับการเปลี่ยนแปลงถาวรคุณจะต้องเพิ่มสิ่งต่อไปนี้ใน.zshrcไฟล์ของคุณ:
unsetopt nomatch

สิ่งนี้จะป้องกัน ZSH ที่จะพิมพ์ข้อผิดพลาดเมื่อไม่พบคู่ที่ตรงกัน

  • เป็นไปได้ก็คือการปิดการใช้งาน globbing สำหรับคำสั่งโดยเฉพาะอย่างยิ่งการใช้noglobปรับปรุงคำสั่ง โดยการตั้งค่านามแฝงใน.zshrcตัวอย่าง:
alias scp='noglob scp'

ขอบคุณ! bashไม่เคยมีการทำอย่างนั้นด้วย
มอร์แกน

@ มอร์แกนมันแปลกจริง ๆ ถ้าไม่มีเครื่องหมายอัญประกาศ Bash ควรขยายเครื่องหมายตัวหนอนก่อนที่จะrsyncเห็น เป็นไปได้ไหมว่าคุณเพิ่งใช้พา ธ เดียวกันกับโฮมไดเรกทอรีบนเซิร์ฟเวอร์ทั้งสอง
slhck

@slhck ไม่เขาพูดถูก zsh มีตัวเลือกเพิ่มเติมในการกำหนดค่าสัญลักษณ์แทนดังนั้นพฤติกรรมนี้สามารถเปลี่ยนแปลงได้ใน zshrc
Spack

1
@ sa125 ฉันแก้ไขคำตอบของฉันแล้ว
Spack

1
@slhck: bashขยายเครื่องหมายตัวหนอนเมื่อเริ่มต้นคำหรือเป็นอักขระตัวแรกที่ตามหลัง:หรือตัวแรก=ในการกำหนดตัวแปร มิฉะนั้นจะได้รับการปฏิบัติอย่างแท้จริง
chepner

8

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

~/p/b/a/files ❯❯❯ scp *.* myserver@host:~/
*.*: No such file or directory

~/p/b/a/files ❯❯❯ \scp *.* myserver@host:~/
jquery.min.js                              100%   93KB  92.6KB/s   00:00
json2.min.js                               100%   3377   3.3KB/s   00:00

ฉันหวังว่านี่จะช่วยได้!


ทางออกที่ดี !!
yorch

สมบูรณ์แบบมันใช้งานได้ดีสำหรับฉันบน OSX!
sMyles

น่ากลัว !! แต่ด้วยเหตุผลใดว่าทำไม / ทำงานอย่างไร
Kannan Ramamoorthy

3

วิธีนี้จะช่วยแก้ปัญหาของคุณโดยไม่ต้องอ้าง URL ด้วยตนเอง

autoload -U url-quote-magic  
zle -N self-insert url-quote-magic

# sort it out for SCP
some_remote_commands=(scp rsync)
zstyle -e :urlglobber url-other-schema \
  '[[ $some_remote_commands[(i)$words[1]] -le ${#some_remote_commands} ]] && reply=("*") || reply=(http https ftp)'

และนี่จะไปใน. zshrc?
มอร์แกน

ใช่สิ่งนี้จะเข้าสู่การกำหนดค่า zsh ของคุณ FWIW เพียงแค่เริ่มเชลล์ใหม่ ( zsh -fสำหรับ conf เชลล์เชลล์ที่ยอมรับ) คัดลอกและวางคำสั่งในเชลล์ของคุณและพิมพ์ (หรือวาง) rsyncคำสั่งของคุณ คุณจะเห็นเวทย์มนตร์ในที่ทำงาน ;-) (ตัวอักษรพิเศษที่ URL จะได้รับการเสนอราคาโดยอัตโนมัติ)
ฟรานซิสโก

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