teeユーティリティをエミュレートするために追加のファイル記述子を使用できますか?

teeユーティリティをエミュレートするために追加のファイル記述子を使用できますか?

追加のファイル記述子の使用方法を完全に理解できませんでした。私はそれを使ってユーティリティの機能をエミュレートし、teeコマンドの出力を見ながら同時にファイルに書き込むことができると思います。また、これは追加のファイル記述子の使用方法をよりよく理解するのに役立ちます。

これまでの私の試みは、

date 3>&1 3>file

私の考えは創造することです。サム繰り返し1(標準出力)とリダイレクトサムwritefileなので、いつものように端末にstdoutを書いてサムファイルに書き込みます。

しかし、これはうまくいきません。私がしたとき、cat fileそれは空でした。私は何が間違っていましたか?

ベストアンサー1

リダイレクト演算子多様性出力がどこに行くか(または入力がどこから来るか)。3>&1「ファイル記述子 3 がファイル記述子 1 が現在指している場所 (つまり、端末) を指すようにする」を意味します。3>fileこれは、「ファイル記述子3が次を指すようにするfile」を意味します。 fd 3 が端末を指す短い時間の間は何も起こらないので、端末出力は得られません。

両方の場所で同じデータを取得するには、データをコピーする必要があります。これが職業だtee。読み取る各バイトごとにそのバイトを2回出力します(ファイル引数と標準出力が提供されている場合)。

>&時々複製と呼ばれることを心配しないでください。それがコピーするのはファイル記述子3>&1fd 1をfd 3にコピーします。これは、fd 1に送信されたデータとfd 3に送信されたデータがマージされていることを意味します。どちらも fd 1 が指す位置に送信されます。

グラフィックの説明を好む場合は、以下を参照してください。STDOUTとSTDINを接続することはどういう意味ですか?そしてコマンドにどのように複数の出力がありますか?

とにかく、あなたのコマンドはファイル記述子3に何も出力しないので、fd 3をリダイレクトしても何も変わりません。このdateコマンドは標準出力(fd 1)に書き込まれ、リダイレクトされません。


Zshには次の機能があります。複数のオペレーティングシステムこれは出力リダイレクトの意味を変更します。同じファイル記述子に同じコマンドの出力リダイレクトが複数ある場合多様性この記述子が指す位置ですが、後続の記述子はコピー指定された宛先にデータを送信します。たとえば、stdout が指す場所を除いてファイルの出力を取得するには、次のようにします。

date >&1 >file

Zshはこれを行っていますtee。リダイレクトの順序が重要です。演算子が評価されると、標準出力がすでに存在するため、2回date >file >&1作成されます。file>&1datefile

おすすめ記事