名前付きファイルの内容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として印刷します。
ofile
fd 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
cat
fd 1(stdout)がfd 3で開かれたリソースと同じリソースに移動する必要があるという意味ですか?つまり、読み書き./tmp
モードで開くと、fd 3をfd 1で開いたのと同じリソースに移動する必要がありますか?ちょうど置くに設定されています./tmp
。
したがって、cat
fd 1と3をリダイレクトし始めます./tmp
。cat
fd 3に何もせずにcat
fd 3を好きなようにリダイレクトできます。
ただし、内容はfd 1に記録されているため、その内容がの先頭に記録されているfile
ことがわかります。file
./tmp
cat file
file
コンテンツを一度に1つのfdにのみ書き込みます。file
2つの異なるfdに2回書きたい場合は、次のようにしますtee
。
存在する
< file tee ./tmp
tee
fd 0(ここでは読み取り専用モードで開くようにリダイレクトされます)(切り捨て書き込み専用モードで開く)からfile
読み取った内容をfd 1(stdout)に書き込みます。./tmp
tee
開いてみてもいいかもしれないけど./tmp
追加modeでは、そのような切り捨てなしに読み取り+書き込みモードで開くように-a
指示することはできません。./tmp
3<>
これを行うには、次のものが必要です。
< 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
。