bash**はzsh**とは異なります。 bashの動作を変更できますか?

bash**はzsh**とは異なります。 bashの動作を変更できますか?

このファイルツリーがあります。

a.py
b/c.py

Bashではls -l **/*.py与えられた

b/c.py

Zshではls -l **/*.py良い

a.py
b/c.py

これを防ぐためにbashの動作を変更する方法はありますかls *.py **/*.py

PS:私は使用しましたが、ls問題はすべてのコマンドにあります。

答え1

通常のshおよび通常のsh以前のバージョンと互換性のあるシェルでは、モードと***同じです。 Zshはいくつかの方法でshの互換性から外れます。その一つはモード**/***/タスクです。再帰ワイルドカード**/…現在のディレクトリ、そのサブディレクトリ、サブサブディレクトリなどを検索する***/…だけでなく、サブディレクトリへのシンボリックリンクも通過します。

Bash ≥4.3で同様の機能を有効にできます。shopt -s globstar、ksh93でset -o globstar/とset -G。その他の関連オプションは次のとおりです。

  • shopt -s dotglobワイルドカードパターンがドットファイルと一致するようにします(zshのset -o dotglob/に似ていますglobdots)。
    • GLOBIGNORE変数を設定すると、bashこのオプションも自動的に有効になります。
    • ksh93を使用すると、同様の効果が得られますFIGNORE=.:..
    • zshでは、(D)ケースごとにパターンに応じてglob修飾子を使用してこれを実行できます。 Bash/ksh93には同様の機能はありません。
  • shopt -s extglobksh88スタイル拡張glob演算子(set -o kshglobzshに似ています)を有効にします(kshでは常に有効です)。
    • zshはまた、set -o extendedglob他の構文で任意の正規表現(否定演算子を使用)を表す代替方法も提供します。 Bashにはこの構文に対応する構文はありません。
  • shopt -s nocaseglobset -o nocaseglobパターンマッチングを大文字と小文字を区別しないようにします(zshの/に似ていますset +o caseglob)。
    • zshでは、パターンプレフィックスを付けてケースごとに実行できます(#i)。同様に、ksh93ではパターンプレフィックスを付けることができます~(i)。 Bashには同様の機能はありません。
  • shopt -s nullglob一致するファイルがない場合は、パターンを変更せずに残すのではなく、globパターンは空のリストに展開されます(set -o nullglobzshに似ています)。
    • zshでは、(N)パターンに応じてglob修飾子を使用してケースごとにこれを実行できます。 ksh93では、~(N)モードが前に来ます。 Bashには同様の機能はありません。
  • shopt -s failglobパターンを変更せずにそのままにするのではなく、一致するファイルがない場合はエラーをトリガーします(zshのデフォルト動作)。
  • set -o globstarshortたとえば、.inに似ていますが(拡張子に含まれていることを除いて)同じようにzsh書くこともできます。****/***/*.py**.pybash -O globstar****/*dir/**dir/**.py*.py

Bash 4.0ではこのglobstarオプションと**モードを導入しましたが、bash 4.3以前は常にディレクトリのシンボリックリンクを巡回しましたが、5.0以前はディレクトリのシンボリックリンクを巡回しました。一部シンボリックリンク。 Bash 3.x以下にはそのような機能はありません。

tcsh同様の形式の再帰ワイルドカードを、yashおよびシェルでも使用できますfish(デフォルトでは有効ではありません)。


.¹これらのシェルと..特別なディレクトリの間にわずかな違いがあることに注意してください。これらはzshglobによって拡張されず、設定はksh93のglobから除外されますが、bashではEven withFIGNORE=.:..のようにglobから除外されますが。設定は役に立ちますが、そうではありません。*dotglob.*GLOBIGNORE=.:...*dir/.*.*/file

関連情報