Menggunakan wildcard dalam perintah dengan zsh

40

Menggunakan perintah seperti rsyncdan scpdengan ZSHsaya mengalami masalah. Alih-alih perilaku (normal) memberi saya semua file yang cocok, itu tidak akan berjalan dan kembali:

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

Bagaimana saya bisa memperbaikinya?

Saya .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
Morgan
sumber

Jawaban:

51

Ini terkait dengan bagaimana ZSH mengelola karakter globbing untuk menghasilkan nama file. Secara default, ZSH akan menghasilkan nama file dan melemparkan kesalahan sebelum menjalankan perintah jika tidak menemukan kecocokan.

Ada banyak cara untuk mem-bypass perilaku ini, berikut adalah beberapa di antaranya:

  • Cara tercepat adalah menyertakan karakter globbing dengan tanda kutip.
$ rsync -azP "user@server:~/*" ~/
  • Untuk perubahan permanen, Anda harus menambahkan yang berikut dalam .zshrcfile Anda :
unsetopt nomatch

Ini akan mencegah ZSH untuk mencetak kesalahan ketika tidak ada kecocokan yang ditemukan.

  • Kemungkinan lain adalah menonaktifkan globbing untuk perintah tertentu dengan menggunakan noglobpengubah perintah. Dengan mengatur alias di .zshrcmisalnya:
alias scp='noglob scp'
Spack
sumber
Terima kasih! Tidak pernah harus melakukan itu bash.
Morgan
@ Morgan Aneh, sebenarnya. Tanpa tanda kutip, Bash harus memperluas tilde sebelum rsyncmelihatnya. Mungkinkah Anda hanya menggunakan jalur yang sama untuk direktori home di kedua server?
slhck
Sslhck Tidak, dia benar. zsh memiliki beberapa opsi lagi untuk mengonfigurasi wildcard sehingga perilaku ini dapat diubah di zshrc.
Spack
1
@ sa125 Saya sudah mengedit jawaban saya.
Spack
1
Sslhck: bashhanya memperluas tilde ketika kata dimulai , atau karakter pertama mengikuti :atau yang pertama =dalam penugasan variabel. Kalau tidak, itu diperlakukan secara harfiah.
chepner
8

Saya telah menggunakan zpretzo selama beberapa bulan dan juga mengalami masalah ini. Saya menemukan solusi yang rapi dan berguna jika Anda tidak ingin melakukan perubahan: cukup tambahkan backslash ke perintah.

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

Saya harap ini membantu!

superuseroi
sumber
Solusi hebat !!
Yorch
Sempurna, ini bekerja sangat baik untuk saya di OSX!
sMyles
Hebat !! Tetapi ada alasan mengapa / bagaimana ini bekerja?
Kannan Ramamoorthy
3

Ini menyelesaikan masalah Anda tanpa harus mengutip URL secara manual

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)'
Francisco
sumber
Dan ini masuk .zshrc?
Morgan
ya, ini masuk ke konfigurasi zsh Anda. FWIW, mulai saja shell baru ( zsh -funtuk konfigurasi shell kanonik), salin & tempel perintah di shell Anda, dan ketik (atau rekatkan) rsyncperintah Anda . Anda akan melihat keajaiban di tempat kerja ;-) (karakter khusus di URL akan secara otomatis dikutip)
Francisco
Anda harus menerima jawaban saya :-P ini jauh lebih baik daripada mengutip atau mematikan globing untuk seluruh perintah.
Francisco