ファイル記述子を読む

ファイル記述子を読む

名前付きファイルの内容file

testing 1
testing 2

テストされたコマンド

exec 3<> ./tmp
cat file 1>&3 3>&1

何も出力されません。なぜ?

私は私のコマンドを次のように読みました。

catファイル記述子の内容をfile読み取ってSTDOUTファイル記述子に供給し、ファイル記述子の3内容を取得して3その内容をファイル記述子に供給します。STDOUT

私は命令を誤って読みましたか?

コマンドをよりよく理解し、出力を得るためにどのように読み取ることができますか?file


Stéphaneの答えを理解した後、次のコマンドを試しました。

cat file 1>&3 3> ofile

fd 3の内容(fd 1、つまりSTDOUTから取得)を書きません。ofile

しかし、次のコマンドを試しました。

cat file 1>&3 && cat <3

fd 3の内容をSTDOUTとして印刷します。

ofilefd 3にfd 1の内容がありますが、なぜfd 3が作成されないのですか?


Stéphane、Jesse_b コマンド、つまり以下の説明で説明するコマンド

cat file 3> ofile 1>&3 

file動作し、コンテンツを書きますが、ofileコマンドは

cat file 1>&3 3> ofile

前述のようにofile

1>&3終了と開始の位置は、3> ofileこれら2つのコマンドの出力にどのような影響を与えますか?

ベストアンサー1

cmd x>&y次のように話してください。 "fd yがリダイレクトするリソースにfd xをリダイレクトしてください。"

だから:

cat 1>&3 3>&1

catfd 1(stdout)がfd 3で開かれたリソースと同じリソースに移動する必要があるという意味ですか?つまり、読み書き./tmpモードで開くと、fd 3をfd 1で開いたのと同じリソースに移動する必要がありますか?ちょうど置くに設定されています./tmp

したがって、catfd 1と3をリダイレクトし始めます./tmpcatfd 3に何もせずにcatfd 3を好きなようにリダイレクトできます。

ただし、内容はfd 1に記録されているため、その内容がの先頭に記録されているfileことがわかります。file./tmp

cat filefileコンテンツを一度に1つのfdにのみ書き込みます。file2つの異なるfdに2回書きたい場合は、次のようにしますtee

存在する

< file tee ./tmp

teefd 0(ここでは読み取り専用モードで開くようにリダイレクトされます)(切り捨て書き込み専用モードで開く)からfile読み取った内容をfd 1(stdout)に書き込みます。./tmp

tee開いてみてもいいかもしれないけど./tmp追加modeでは、そのような切り捨てなしに読み取り+書き込みモードで開くように-a指示することはできません。./tmp3<>

これを行うには、次のものが必要です。

< file tee /dev/fd/3 3<> ./tmp

Linux以外の機能または組み込みzshのティー機能を使用してください。

cat < file 3<> ./tmp >&1 >&3 3>&-

fd 1が2回リダイレクトされ、zshオプションが有効になるとmulltios(デフォルトで設定されている)、内部teeが実行され、出力が両方のターゲットに渡されます(読み取りcat出力を実行し、両方のターゲットプロセスの内部teeに書き込むことによって)。

fd 3の一時的な使用は、次の問題を解決することです。

cat < file >&1 1<> ./tmp

zshは文句を言う。zsh: file mode mismatch on fd 1欲しいと仮定しているので文句を言う読むから./tmp

おすすめ記事