Sử dụng ký tự đại diện trong các lệnh với zsh


39

Sử dụng các lệnh như rsyncscpvới ZSHtôi đã gặp rắc rối. Thay vì hành vi (bình thường) đưa cho tôi tất cả các tệp phù hợp, nó sẽ không chạy và trả về:

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

Làm thế nào tôi có thể sửa lỗi này?

Của tôi .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

Câu trả lời:


50

Điều này có liên quan đến cách ZSH quản lý các ký tự toàn cầu để tạo tên tệp. Theo mặc định, ZSH sẽ tạo tên tệp và đưa ra lỗi trước khi thực hiện lệnh nếu không tìm thấy kết quả khớp.

Có nhiều cách để bỏ qua hành vi này, đây là một số trong số đó:

  • Nhanh nhất là gửi kèm các ký tự hình cầu với dấu ngoặc kép.
$ rsync -azP "user@server:~/*" ~/
  • Để thay đổi vĩnh viễn, bạn sẽ phải thêm các mục sau vào .zshrctệp của mình :
unsetopt nomatch

Điều này sẽ ngăn ZSH in lỗi khi không tìm thấy kết quả khớp.

  • Một khả năng khác là vô hiệu hóa globalbing cho một lệnh cụ thể bằng cách sử dụng công cụ noglobsửa đổi lệnh. .zshrcVí dụ, bằng cách đặt bí danh :
alias scp='noglob scp'

Cảm ơn! Không bao giờ phải làm điều đó với bash.
Morgan

@Morgan Thật là kỳ lạ. Không có dấu ngoặc kép, Bash nên mở rộng dấu ngã trước khi rsyncnhìn thấy nó. Có thể là bạn chỉ đang sử dụng cùng một đường dẫn cho thư mục chính trên cả hai máy chủ?
slhck

@slhck Không, anh ấy đúng. zsh có thêm một số tùy chọn để cấu hình ký tự đại diện để hành vi này có thể được thay đổi trong zshrc.
Spack

1
@ sa125 Tôi đã chỉnh sửa câu trả lời của mình.
Spack

1
@slhck: bashchỉ mở rộng dấu ngã khi nó bắt đầu một từ hoặc là ký tự đầu tiên theo sau một :hoặc đầu tiên =trong một phép gán biến. Nếu không, nó được đối xử theo nghĩa đen.
chepner

8

Tôi đã sử dụng zpretzo trong một vài tháng và cũng gặp vấn đề này. Tôi đã tìm thấy một giải pháp gọn gàng và hữu ích nếu bạn không muốn thực hiện bất kỳ thay đổi nào: chỉ cần thêm dấu gạch chéo ngược vào lệnh.

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

Tôi hi vọng cái này giúp được!


Giải pháp tuyệt vời !!
vào

Hoàn hảo, điều này làm việc rất tốt cho tôi trên OSX!
sMstyle

Tuyệt vời!! Nhưng bất kỳ lý do tại sao / làm thế nào điều này làm việc?
Kannan Ramamoorthy

3

Điều này giải quyết vấn đề của bạn mà không cần phải trích dẫn URL theo cách thủ công

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

Và điều này đi vào .zshrc?
Morgan

vâng, điều này đi vào cấu hình zsh của bạn. FWIW, chỉ cần bắt đầu một shell mới ( zsh -fđối với conf shell canonical), sao chép và dán các lệnh trong shell của bạn và gõ (hoặc dán) rsynclệnh của bạn . Bạn sẽ thấy điều kỳ diệu tại nơi làm việc ;-) (ký tự đặc biệt tại URL sẽ được tự động trích dẫn)
Francisco

bạn nên chấp nhận câu trả lời của tôi :-P điều này tốt hơn rất nhiều so với trích dẫn hoặc tắt sự hả hê cho toàn bộ lệnh.
Francisco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.