ls -l | wc -l の出力は、新しいファイルにリダイレクトされると異なります

ls -l | wc -l の出力は、新しいファイルにリダイレクトされると異なります

「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 を減算します。

関連情報