カスタムファイル記述子に書き込むときにteeを出力しようとしています。例:
exec 4>"/tmp/testfile.txt"; # open FD 4
tee -a >&4 <<< "Output this to stdout" # Write to open file
exec 4>&- # close FD
実行すると、tee -a /proc/self/fd/4 <<< "Output this to stdout"
ターミナル/標準stdoutで出力を表示できます。
BASH 5.0.16(1) リリースを使用しています。
FD 1(stdout)とFD 4の間で接続を確立しようとしましたが、文字列はファイルに書き込まれません。
ありがとうございます!
編集する: @Stéphane Chazelasの回答をご覧ください。以下の私のアップデートは正確かもしれませんが、あまりにも複雑です。
修正する:
ますます近づいているようです。これを試してみると、tee <<< "Output this to stdout" >(tee -a >&4)
端末で出力が実際に表示され、ファイルに書き込まれますが、何らかの理由で内容を上書きして追加(-a)しないようです。
アップデート2: 今私の間違いを発見したようです。
最初:Bash Process Substitutionでは、stdoutに出力し、teeを使用してFDに2回書き込むことができます。私はこれをこうする:
exec 4>"/tmp/testfile.txt"; # open FD 4
tee >(tee -a >&4) <<< "Output this to stdout" # Write to open file
exec 4>&- # close FD
前述のようにファイルの内容を上書きしましたが、これが答えの2番目の部分です。
第二:私は仕事を見つけることを完全に忘れました!検索場所(またはポインタ)を使用してファイルを開くと、exec 4>"..."
ファイルの先頭にあります。この場合、追加はファイルを上書きするのと同じです。この問題を解決するには、ファイル記述子は現在の場所をファイルの最後に設定する作業を実行する前にファイル全体を読み取る必要があります。 1つの解決策はを使用することですcat
。もちろん、読み込むためにファイルも開く必要があります(<String>)。
ついに: これは私にとって効果的です。ファイルのFDを開き、内容を読み込んで追加します。
exec 4<>"/tmp/testfile.txt"; # open FD 4 read (<) and write (>)
cat <&4 >/dev/null; tee >(tee -a >&4) <<< "Output this to stdout" # read fd (>/dev/null to silent the output) for correct position and append to. Also output to stdout
exec 4>&- # close FD (this closes it completly, so no need for exec 4<&-)
覚えている: これは、ファイルを変更するために複数のプロセスを使用する場合は、実際に注意する必要があります。私が正しく理解したなら、これは「本当の」アドインではありません。例:場所3の猫を作成しました。同時に、他の誰かがファイルに2行を追加しました。現在、既知の場所を使用して追加すると、他の2行が失われます。
私はUnixシステムでファイルを読むことについてもっと学んだようです。全体的にFDを開設する方案については、慎重に考えてみると良いと思います。ファイルが空であることを知っていれば大丈夫です。ただし、すでにコンテンツを含むファイルには危険がある可能性があります。ポインタが最新でない場合、他のプロセスがポインタに書き込むことができます。技術的な側面では誤解されたかもしれませんが、ある側面では正確でなければなりません。
ベストアンサー1
fd 1と4に同じ入力を書き込むには、zsh
次のようにします。
cat <<< some-input >&1 >&4
(またはデフォルト値<<< some-input >&1 >&4
の場合もあります)cat
$NULLCMD
inでzsh
そのオプションが有効になっている場合(デフォルトでは有効)、出力のためにfd multios
(ここでは1の略語>
)を複数回リダイレクトすると、fdは内部ingプロセスにリダイレクトされ、多重化された再利用がすべての項目に出力されます。目標。1>
tee
この機能は<<<
(zsh拡張も含む)現在かなり多くの異なるシェル(zshを含むbash
)でサポートされていますが、サポートされていません。multios
LinuxおよびCygwin以外のシステムでは、次のこともできます。
tee /dev/fd/4 <<< some-input
ほとんどのシステム(上記の2を除く)と同様に、オープン操作は/dev/fd/4
fd 4をコピーするのと同じ操作を行います(と同じ{fd}>&4
)。
しかし、LinuxとCygwinではそうではありません。代わりに、開く/dev/fd/4
(ここと同じ/proc/self/fd/4
)は、そのfdで現在開いているファイルを最初から再度開くように機能します。
したがって、fd 4がソケットを指しても機能しません。開いている()ソケットが通常のファイルの場合、>
ファイルは切り捨てられます。
を使用するとtee -a /dev/fd/4 <<< some-input
切り捨てを回避できますが、fd 4は保持されるため、fd 4に書き換えると出力内容を上書きできますtee
。そのためにはfd 4が必要です。返品これを防ぐには、追加モードで開きます(すべての書き込みが最後に行われることを保証します)。
行為:
tee >(cat >&4) <<< some-input
また、この問題は解決しますが、追加のプロセスでデータをプッシュすることを意味しますcat
。