
追加のファイル記述子の使用方法を完全に理解できませんでした。私はそれを使ってユーティリティの機能をエミュレートし、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>&1
fd 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
>&1
date
file
答え2
いいえ、出力を複製しないためです。ファイル記述子をコピーするには、その記述子を2回出力する必要があります。
次のようにループを使用してこれを実行できます。
while read l
do
echo "$l" >&3
echo "$l" >&4
done
バイナリデータの場合、エラーが発生します(0がチャンクされ、crlf -sがlfに変換されます)。
あなたの例は次のとおりです。
- fd 3をファイルとして開く
- fd 1を次に複製します。fd3の代わりに(つまり。閉鎖古いfd3を使用し、fd3を古いstdoutの「代替アドレス」にします。
リダイレクトは本質的にレプリカであり、Unixという用語はハードリンクと同じです。コマンドサフィックスを使用すると、3>&1
fd 3とfd 1が同じエンティティを指します(現在はfile
)。
man 3 dup2
Cに少しでも興味がある場合は、fdリダイレクトが実行する機能であるaを確認したいと思います。