zshを使用したコマンドでのワイルドカードの使用


39

rsyncやなどのコマンドを使用するとscpZSH問題が発生します。一致するすべてのファイルを提供する(通常の)動作の代わりに、実行されずに戻ります。

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

どうすれば修正できますか?

僕の .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

回答:


50

これは、ZSHがグロビング文字を管理してファイル名を生成する方法に関連しています。デフォルトでは、ZSHはファイル名を生成し、一致するものが見つからない場合はコマンドを実行する前にエラーをスローします。

この動作を回避する方法はたくさんありますが、そのうちのいくつかを以下に示します。

  • 最も速いのは、グロビング文字を引用符で囲むことです。
$ rsync -azP "user@server:~/*" ~/
  • 永続的な変更を行うには、.zshrcファイルに次を追加する必要があります。
unsetopt nomatch

これにより、一致するものが見つからない場合にZSHがエラーを出力するのを防ぎます。

  • 別の可能性は、noglobコマンド修飾子を使用して特定のコマンドのグロビングを無効にすることです。.zshrcたとえば、エイリアスを設定することにより:
alias scp='noglob scp'

ありがとう!でそれをする必要はありませんでしたbash
モーガン

@Morgan実際、それは奇妙です。引用符がないと、Bashはチルドを表示する前に展開する必要rsyncがあります。両方のサーバーのホームディレクトリに同じパスを使用しているだけかもしれませんか?
slhck

@slhckいいえ、彼は正しい。zshにはワイルドカードを設定するオプションがいくつかあるため、この動作はzshrcで変更できます。
スパック

1
@ sa125回答を編集しました。
スパック

1
@slhck:単語を開始するbashとき、または変数割り当ての最初または後に続く最初の文字である場合にのみ、チルダを展開します。それ以外の場合は、文字通り処理されます。:=
chepner

8

私はzpretzoをかなりの数か月使用しており、この問題も経験しました。変更を行いたくない場合は、コマンドにバックスラッシュを追加するだけで、きちんとした便利なソリューションに出会いました。

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

これがお役に立てば幸いです!


素晴らしい解決策!!
ヨーチ

完璧です、これはOSXで私にとって素晴らしい仕事でした!
sMyles

驚くばかり!!しかし、これがなぜ/どのように機能するのでしょうか?
Kannan Ramamoorthy

3

これにより、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)'

そして、これは.zshrcに入りますか?
モーガン

はい、これはあなたのzsh設定に入ります。FWIW、新しいシェルを開始し(zsh -f標準シェルconfの場合)、シェル内のコマンドをコピーして貼り付け、コマンドを入力(または貼り付け)しますrsync。魔法のように見えます;
フランシスコ

あなたは私の答えを受け入れる必要があります:-Pこれは、コマンド全体の引用やグロビングをオフにするよりもはるかに優れています。
フランシスコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.