私は最近bashからzshに切り替えました。
ls *
このディレクトリ内のすべてのファイルを一覧表示するだけでなく、2つのレベルのツリーを表示します。
また
rm -rf somepath/*
出力で失敗するzsh: no matches found:
以前はbashで問題なく動作していました。誰かがこの動作を取り戻すのを手伝ってくれる?
Oh-my-zshをインストールしました。
ls *
はbashでも同じ効果があります。シェルが何であっても、シェルが最初にワイルドカードを展開し、次に展開の結果をコマンドに渡すことによって何が起こります。たとえば、現在のディレクトリに2つのサブディレクトリdir1
とdir2
、および2つの通常ファイルfile1
とfile2
の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
内の*
というファイルを削除しようとしますが、そのようなファイルがないため、この試行は失敗します。オプション-f
をrm
に渡したので、ファイルが欠落しているというメッセージは表示されません。
Zshでは、デフォルトで、ワイルドカードがどのファイルとも一致しない場合、zshはこれをエラーとして扱います。オプション nomatch
をオフにすることで、zshの動作を変更できます。
setopt no_nomatch
ワイルドカードが一致しない場合にシェルに通知することは、通常、コマンドラインでの望ましい動作であるため、これはお勧めしません。この場合、空のリストでも大丈夫であることをzshに伝えるより良い方法があります。
rm -rf somepath/*(N)
N
は glob qualifier で、ワイルドカードがどのファイルとも一致しない場合、空のリストに展開することを示しています。