Uso de comodines en comandos con zsh

40

Usando comandos como rsyncy scpcon ZSHme he encontrado con problemas. En lugar del comportamiento (normal) de darme todos los archivos coincidentes, no se ejecutará y devolverá:

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

¿Cómo puedo arreglar esto?

Mi .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
fuente

Respuestas:

51

Esto está relacionado con la forma en que ZSH gestiona los caracteres globales para generar nombres de archivo. Por defecto, ZSH generará los nombres de archivo y generará un error antes de ejecutar el comando si no encuentra coincidencias.

Hay muchas formas de evitar este comportamiento, estas son algunas de ellas:

  • Lo más rápido es encerrar los caracteres con comillas.
$ rsync -azP "user@server:~/*" ~/
  • Para un cambio permanente, deberá agregar lo siguiente en su .zshrcarchivo:
unsetopt nomatch

Esto evitará que ZSH imprima un error cuando no se encuentre ninguna coincidencia.

  • Otra posibilidad es deshabilitar el globbing para un comando particular usando el noglobmodificador de comando. Al establecer un alias en, .zshrcpor ejemplo:
alias scp='noglob scp'
Spack
fuente
¡Gracias! Nunca tuve que hacer eso con bash.
Morgan
@ Morgan Eso es extraño, en realidad. Sin las comillas, Bash debería expandir la tilde antes de rsyncverla. ¿Podría ser que estaba usando la misma ruta para el directorio de inicio en ambos servidores?
slhck
@slhck No, tiene razón. zsh tiene algunas opciones más para configurar comodines para que este comportamiento se pueda cambiar en zshrc.
Spack
1
@ sa125 He editado mi respuesta.
Spack
1
@slhck: bashsolo expande una tilde cuando comienza una palabra, o es el primer carácter que sigue a uno :o el primero =en una asignación variable. De lo contrario, se trata literalmente.
chepner
8

He estado usando zpretzo durante varios meses y también experimenté este problema. Encontré una solución ordenada y útil si no desea realizar ningún cambio: simplemente anteponga una barra diagonal inversa al 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

¡Espero que esto ayude!

superuseroi
fuente
¡Gran solución!
Yorch
¡Perfecto, esto funcionó muy bien para mí en OSX!
sMyles
¡¡Increíble!! ¿Pero alguna razón por qué / cómo funciona esto?
Kannan Ramamoorthy
3

Esto resuelve su problema sin tener que citar manualmente las 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)'
Francisco
fuente
¿Y esto va en .zshrc?
Morgan
sí, esto entra en su configuración de zsh. FWIW, simplemente inicie un nuevo shell ( zsh -fpara una configuración de shell canónico), copie y pegue los comandos en su shell y escriba (o pegue) su rsynccomando. Verá la magia en el trabajo ;-) (los caracteres especiales en la URL se cotizarán automáticamente)
Francisco
deberías aceptar mi respuesta :-P esto es mucho mejor que citar o desactivar gloging para todo el comando.
Francisco