Enterキーを押したとき
(cd <somewhere>/; ls -gG S09E03*
ディレクトリに一致するファイルがないため、エラーが発生すると予想しましたがS09E03*
(この内容を確認しました)、コマンドを実行すると、目的のファイルに関する情報が表示されました。
cd
したがって、私のシェル(パッチされたDebian Busterのzsh、つまりバージョン5.7.1)は、正しいディレクトリ(つまり後で)になるまでグロービングを実行しないようです。cd
組み込まれているので(デフォルトでなければならない)シェルは私が望む場所を知っていると思いますか?
私は完全に消えたのだろうか?代わりに、2つの異なるファイルに関する情報を表示するサブシェルとは何が関係していますか?(cd <somewhere1>; ls -l <prefix>*; cd <somewhere2>; ls -l <prefix>*)
だからそうは思いませんが、(もう一度)間違っていますか?それとも他のものがワイルドカードを遅らせることです(私が考えたことに関して)。
<somewhere>
かなり長いので、出力にそのパスが含まれないようにしています。ls
ls -gG
ファイルの所有者とグループが比較したいいくつかの属性についてファイルごとに異なる可能性があることを知っているので
答え1
シェル(zshだけでなく)完成分析する前のコマンド拡大するそれから実装するそれ。
- 解析では、次のように入力を分類します。シェル構文。このステップには、どの文字が単語区切り文字、予約文字、コマンド演算子、リダイレクト演算子、文書マーカー、引用符などであるかを識別することが含まれます。
- コマンドを実行すると、コマンド演算子(など)が評価され
;
、単純なコマンドの場合は次のようになります&
。|
パラメータの割り当て、リダイレクトそして拡大する左から右へ。 - 実行時に呼び出されます。外部コマンド、組み込みまたは機能(存在する場合)。
ここでは非常に一般的な概要のみを提供することに注意してください。いくつかの極端なケースはトリッキーで、シェルによって異なる可能性があるため、この記事ではこれについて議論しません。
与えられると、(cd subdir/; ls -gG S09E03*)
シェルはまずそれを解析して次の結果を得ます。
- サブシェル実行中:
- 2つのコマンドの順序:
cd
2つの一般的な単語、subdir/
(引用符なし)で構成される単純なコマンドです。ls
、、(引用符を除く)3つの一般的な単語で構成される単純なコマンドです-gG
。S09E03*
- 2つのコマンドの順序:
これはシェルが行うことと同じです。たとえば、関数定義を処理する場合
f () {
(cd subdir/; ls -gG S09E03*)
}
コマンドが解析されると、シェルはそれを実行します。サブシェル構成用のサブシェルを作成します。サブシェル内で最初に最初の単純なコマンドを展開して実行し、次に2番目のコマンドを展開して実行します。subdir/
最初の単純コマンドの実行中に現在のディレクトリがに変わります。拡張S09E03*
(つまり、ワイルドカードステップが発生する場所)は後で発生します。
しかし、サブシェルは単なる詳細であり、何も変更しません。;
2つのコマンドを分離し、最初のコマンドが2番目のコマンドの前に実行されるようにすることが重要です。
「シェルが私が望む場所を知っている」というのではなく、発生する場所で発生します。コマンドパラメータの拡張は、常にコマンド自体と同じディレクトリで発生します(これを実行するために組み込み関数を呼び出すことができる最後の手順を除いて、コマンド実行のどの部分も現在のディレクトリを変更できません)。機能)。