Usando curingas em comandos com zsh


39

Usando comandos como rsynce scpcom ZSHeu tive problemas. Em vez do comportamento (normal) de me fornecer todos os arquivos correspondentes, ele não será executado e retornará:

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

Como posso consertar isso?

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

Respostas:


50

Isso está relacionado à maneira como o ZSH gerencia caracteres globbing para gerar nomes de arquivos. Por padrão, o ZSH gera os nomes dos arquivos e gera um erro antes de executar o comando, se não encontrar correspondências.

Há muitas maneiras de ignorar esse comportamento, eis algumas delas:

  • O mais rápido é colocar os caracteres brilhantes entre aspas.
$ rsync -azP "user@server:~/*" ~/
  • Para uma alteração permanente, você precisará adicionar o seguinte no seu .zshrcarquivo:
unsetopt nomatch

Isso impedirá que o ZSH imprima um erro quando nenhuma correspondência for encontrada.

  • Outra possibilidade é desativar o globbing para um comando específico usando o noglobmodificador de comando. Ao definir um alias em, .zshrcpor exemplo:
alias scp='noglob scp'

Obrigado! Nunca tive que fazer isso bash.
Morgan

@ Morgan Isso é estranho, na verdade. Sem as aspas, o Bash deve expandir o til antes rsyncmesmo de vê-lo. Será que você estava apenas usando o mesmo caminho para o diretório inicial nos dois servidores?
slhck

@slhck Não, ele está certo. O zsh tem mais algumas opções para configurar curingas, para que esse comportamento possa ser alterado no zshrc.
Spack

11
@ sa125 Eu editei minha resposta.
Spack

11
@slhck: bashsó expande um til quando inicia uma palavra ou é o primeiro caractere após um :ou o primeiro =em uma atribuição de variável. Caso contrário, é tratado literalmente.
chepner

8

Uso o zpretzo há alguns meses e também enfrentei esse problema. Encontrei uma solução interessante e útil se você não quiser fazer alterações: basta acrescentar barra invertida ao comando.

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

Eu espero que isso ajude!


Ótima solução !!
yorch 28/03

Perfeito, isso funcionou muito bem para mim no OSX!
Smyles

Impressionante!! Mas qualquer razão por que / como isso funciona?
Kannan Ramamoorthy

3

Isso resolve seu problema sem precisar citar manualmente os URLs

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

E isso entra em .zshrc?
18713 Morgan

sim, isso entra na sua configuração zsh. FWIW, basta iniciar um novo shell ( zsh -fpara uma conf. Canônica), copiar e colar os comandos no seu shell e digite (ou cole) o seu rsynccomando. Você verá a mágica no trabalho ;-) (caracteres especiais na URL serão automaticamente citados) #
Francisco

você deve aceitar minha resposta :-P isso é muito melhor do que citar ou desativar o globing para todo o comando.
Francisco
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.