`echo 'hi' | tee> abc`はなぜ複数のファイルを生成しますが、 `echo 'hi'> abc`は生成しませんか?

`echo 'hi' | tee> abc`はなぜ複数のファイルを生成しますが、 `echo 'hi'> abc`は生成しませんか?

私の環境:zsh、macOS


関連コマンド:

  1. echo 'hi' | tee > a b c
  2. echo 'hi' > a b c
  • aコマンド1は名前があり、内容をb含むファイルを生成します。chi
  • aコマンド2はcontentというファイルを生成しますhi b c

AFAIK、ちょうどコマンド1を使用してくださいいいえ >次のマンページに文書化されていますtee

echo 'hi' | tee a b c

>上記のコード(コマンド1など)を追加すると、まだ複数のファイルが生成されますが、コマンド2は1つのファイルのみが生成される理由を理解するのに役立ちます。

答え1

リダイレクト(>この場合)は、次のパラメータをリダイレクトターゲットとして「使用」します。だから

echo 'hi' | tee > a b c

等しい

echo 'hi' | tee b c > a

tee入力をにコピーbし、c標準出力をにコピーしますa

echo 'hi' > a b c

等しい

echo 'hi' b c > a

標準出力に出力しhi b c、これはa

答え2

これはデフォルトのシェル構文です。リダイレクト演算子は、>標準出力をリダイレクトするファイル名として使用される1つの引数のみを受け入れます。残りのパラメータはコマンドに渡されます。

したがって、最初のコマンドは次のようになります。

echo 'hi' | tee > a b c

コマンドを実行してecho 'hi' | tee b c標準出力をファイルにリダイレクトしますa。結局のところ、tee標準入力は標準出力だけでなく、引数として提供されたすべてのファイルにコピーされます。したがって、エクスポートされたデータはファイルにコピーecho 'hi'され(ファイルリダイレクトを介して)標準出力にコピーされます。teebca

2番目のコマンド:

echo 'hi' > a b c

コマンドを実行して、echo 'hi' b c標準出力をファイルにリダイレクトしますa。生成されたファイルを見るとaテキストが含まれていることがわかりますがhi b c、最初の場合は生成された3つのファイルすべてがテキストのみを含みますhi

答え3

tee標準入力ストリームを取得し、指定されたファイルと標準出力にコピーを送信します。を使用すると、ファイルへの通常の書き込み中に> a標準出力ストリームをファイルにキャプチャできます。ateebc

> filename|適切な間隔を置いてエスケープされない限り、側面の任意の点に現れることがあります。

これを説明するために、以下は同義語です。

echo hi | > a tee b c 
echo hi | tee > a b c 
echo hi | tee b > a c 
echo hi | tee b c > a

関連情報