最近bashからzshに切り替えましたが、入力すると
ls *
このディレクトリ内のすべてのファイルをリストするだけでなく、2つのレベルのツリーを表示します。
また
rm -rf somepath/*
出力で失敗しますzsh: no matches found:
これは、bashで問題なく機能するために使用されていました。誰かが私がこの振る舞いを取り戻すのを手伝ってくれますか?
oh-my-zshをインストールしています。
承認された回答:
ls *
bashでも同じ効果があります。シェルが何であっても、シェルは最初にワイルドカードを展開し、次に展開の結果をコマンドに渡します。たとえば、現在のディレクトリに4つのエントリが含まれているとします。2つのサブディレクトリdir1
およびdir2
、および2つの通常のファイルfile1
およびfile2
。次に、シェルは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
にコピーできます。 同じ効果があります。
rm -rf somepath/*
という事実 somepath
の場合、bashとzshで異なる効果があります 空のディレクトリはまったく別の問題です。
bashでは、somepath/*
の場合 どのファイルとも一致しない場合、bashはコマンドにワイルドカードパターンを残すため、rm
引数-rf
を参照してください およびsomepath/*
。 rm
*
というファイルを削除しようとします ディレクトリsomepath
、およびそのようなファイルがないため、この試行は失敗します。オプション-f
を渡したので rm
へ 、ファイルの欠落については文句を言いません。
zshでは、デフォルトで、ワイルドカードがどのファイルとも一致しない場合、zshはこれをエラーとして扱います。オプションnomatch
をオフにすることで、zshの動作を変更できます。 :
setopt no_nomatch
ワイルドカードが一致しない場合にシェルに通知させることは、通常、コマンドラインでの推奨される動作であるため、これはお勧めしません。この場合、空のリストで問題ないことをzshに伝えるためのはるかに優れた方法があります:
rm -rf somepath/*(N)
N
ワイルドカードがどのファイルとも一致しない場合に空のリストに展開するように指示するglob修飾子です。