
「ls -l | wc -l」は「1+ファイル/ディレクトリ数」(最初の行に1つ追加)を出力します。
しかし、コマンド ls -l | wc -l > temp を実行すると (出力が新しいファイル temp にリダイレクトされる場合)、一時ファイルに保存される値は、リダイレクトせずに出力された値より 1 大きくなります。これは、新しい「temp」ファイルが作成されたためだと思いますが、一時ファイルは ls -l コマンドの実行後に作成されるはずであり、したがって、出力はリダイレクトなしの出力と同じになるはずです。
誰か助けてください
答え1
これは完全に正常な動作です。
まずシェル(sh、bash、csh、kshなど)がコマンドライン全体を読み取ります。
次にプロセス、パイプ、リダイレクトファイルを構築します。右から左への順序そして、実際のコマンドを実行します。
したがって、リダイレクト ファイル (temp) は、ls コマンドが実行される前に作成されます。wc
が実際に起動される前に、"temp" に関連付けられたファイル ハンドルが wc 出力の宛先として使用できるようにする必要があるため、この
操作が必要になります。また、wc コマンドは、ls の出力を wc の入力となるファイル ハンドルにアタッチする前にセットアップする必要があります。
最初は少し非論理的に思えますが、シェルがコマンド シーケンスを構築する方法を理解すれば、これは完全に理にかなっています。
答え2
シェルは実際にはtemp
コマンドの実行を開始する前にファイルを作成するので、常にtemp
ファイルがカウントされます。カウントしたくない場合は、 などの別の場所に一時ファイルを配置します/tmp
。または、取得したカウントから 1 を減算します。