Joker karakterleri zsh komutlarıyla kullanma


39

Gibi rsyncve scpile komutları kullanarak Başım ZSHbelada. Bana eşleşen tüm dosyaları verme (normal) davranışı yerine, çalışmaz ve geri döner:

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

Bunu nasıl düzeltebilirim?

Benim .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

Yanıtlar:


50

Bu, ZSH'nin dosya isimleri oluşturmak için globbing karakterlerini nasıl yönettiği ile ilgilidir. Varsayılan olarak, ZSH dosya isimleri üretecek ve eğer komut bulamazsa, komutu çalıştırmadan önce bir hata verecektir.

Bu davranışı atlamanın birçok yolu vardır, işte bunlardan bazıları:

  • En hızlı olan, genel karakterleri tırnak işaretleri içine almaktır.
$ rsync -azP "user@server:~/*" ~/
  • Kalıcı bir değişiklik için, .zshrcdosyanıza aşağıdakileri eklemeniz gerekir :
unsetopt nomatch

Bu, eşleşme bulunamadığında ZSH'nin bir hata yazdırmasını önleyecektir.

  • Başka bir olasılık, noglobkomut değiştiriciyi kullanarak belirli bir komut için globbing özelliğini devre dışı bırakmaktır . .zshrcÖrneğin bir takma ad ayarlayarak :
alias scp='noglob scp'

Teşekkürler! Bunu asla yapmak zorunda kalmamıştım bash.
Morgan,

@ Morgan Bu gerçekten garip. Alıntılar olmadan, Bash görmeden önce tilde genişletmek rsyncgerekir. Her iki sunucudaki giriş dizini için de aynı yolu kullanıyor olabilir miydiniz?
slhck

@slhck Hayır, o haklı. zsh, joker karakterleri yapılandırmak için bazı seçeneklere sahiptir, bu nedenle bu davranış zshrc'de değiştirilebilir.
Nisanda 13:30

1
@ sa125 Cevabımı düzenledim.
Spack

1
@slhck: bashtilde yalnızca bir sözcük başladığında genişler :veya =değişken atamasında a veya birincisini izleyen ilk karakterdir . Aksi takdirde, kelimenin tam anlamıyla tedavi edilir.
chepner

8

Birkaç aydır zpretzo kullanıyorum ve bu sorunu da yaşadım. Herhangi bir değişiklik yapmak istemiyorsanız temiz ve kullanışlı bir çözüm buldum: Komuta ters eğik çizgi hazırlayın.

~/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

Umarım bu yardımcı olur!


Harika bir çözüm!
yorch

Mükemmel, bu OSX'te benim için harika çalıştı!
sMyles

Korku veren !! Fakat bunun neden / nasıl işe yaradığı herhangi bir sebep?
Kannan Ramamoorthy

3

Bu, URL’leri manuel olarak alıntılamak zorunda kalmadan sorununuzu çözer

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)'

Ve bu .zshrc içinde gider?
Morgan

evet, bu sizin zsh yapılandırmanıza gider. FWIW, yeni bir kabuk başlat ( zsh -fkanonik bir kabuk için), komutları kabuğun içine kopyala ve yapıştır ve komutunu yaz (veya yapıştır) rsync. İşyerinde sihri göreceksiniz ;-) (URL’deki özel karakterler otomatik olarak alıntılanacaktır)
Francisco

Cevabımı kabul etmelisin: - Bu, tüm emir için alıntı yapmaktan ya da küreyi kapatmaktan çok daha iyidir.
Francisco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.