web-dev-qa-db-ja.com

zshでアスタリスク「*」を取得してbashと同じ動作にする方法は?

私は最近bashからzshに切り替えました。

ls *

このディレクトリ内のすべてのファイルを一覧表示するだけでなく、2つのレベルのツリーを表示します。

また

rm -rf somepath/*

出力で失敗するzsh: no matches found:

以前はbashで問題なく動作していました。誰かがこの動作を取り戻すのを手伝ってくれる?

Oh-my-zshをインストールしました。

3
morja

ls *はbashでも同じ効果があります。シェルが何であっても、シェルが最初にワイルドカードを展開し、次に展開の結果をコマンドに渡すことによって何が起こります。たとえば、現在のディレクトリに2つのサブディレクトリdir1dir2、および2つの通常ファイルfile1file2の4つのエントリが含まれているとします。次に、シェルはls *ls dir1 dir2 file1 file2に展開します。 lsコマンドは、最初に既存の非ディレクトリーである引数の名前をリストし、次に各ディレクトリーの内容を順にリストします。

$ ls
dir1  dir2  file1  file2
$ ls -F
dir1/  dir2/  file1  file2
$ ls *
file1  file2

dir1:
…

dir2:
…

lsの動作がbashで異なる場合は、- bash構成を変更 を使用してワイルドカード展開をオフにし、どこでもオフにするか、lsコマンドの意味を変更してリストを抑制しますディレクトリの、おそらくエイリアスで。具体的には、

alias ls='ls -d'

あなたの~/.bashrcにあなたが説明する通りの効果があります。その場合は、この行を~/.zshrcにコピーすると、同じ効果が得られます。


somepathが空のディレクトリである場合、rm -rf somepath/*がbashとzshで異なる効果を持つという事実は、まったく別の問題です。

Bashでは、somepath/*がどのファイルとも一致しない場合、bashはコマンドにワイルドカードパターンを残すため、rmは引数-rfおよびsomepath/*を参照します。 rmは、ディレクトリsomepath内の*というファイルを削除しようとしますが、そのようなファイルがないため、この試行は失敗します。オプション-frmに渡したので、ファイルが欠落しているというメッセージは表示されません。

Zshでは、デフォルトで、ワイルドカードがどのファイルとも一致しない場合、zshはこれをエラーとして扱います。オプション nomatch をオフにすることで、zshの動作を変更できます。

setopt no_nomatch

ワイルドカードが一致しない場合にシェルに通知することは、通常、コマンドラインでの望ましい動作であるため、これはお勧めしません。この場合、空のリストでも大丈夫であることをzshに伝えるより良い方法があります。

rm -rf somepath/*(N)

Nglob qualifier で、ワイルドカードがどのファイルとも一致しない場合、空のリストに展開することを示しています。