異なるスレッドで同時にコンソールとファイルに出力を印刷するコマンド

異なるスレッドで同時にコンソールとファイルに出力を印刷するコマンド

私は bash スクリプトを書いていますが、最後のコマンドを別のプロセスとして開始したいと考えています。最後のコマンドは、すべての出力をファイルに送ります。ただし、出力はコンソールに表示させたいです。これまでのところ、

$ command > "file" &

これは出力を「ファイル」に送信し、コマンドを独自のプロセスとして開始します。ただし、同時にコンソールで出力を確認したいです(ただし、Ctrl + CまたはW / Eを押してもコマンドは停止しません)。これは、この質問ただし、独自のスレッドにする必要があるという注意点があります。

私が試してみました:

$ command | tee "file" &

しかし問題は、Tee がプロセスの一部であり、出力が実際には表示されないことです。

明確にするために、私はcommand独自のプロセスで出力をファイルに送信し、出力がコンソールに表示されるようにしたいのです (q、enter、ctrl+c などを押すまで)。これは bash スクリプトなので、2 つの別々の行でも問題ありません。

答え1

commandファイルへの書き込みを終了したいが、コンソールへの表示を中断できるようにしたいようです。解決策としては別のアプローチをとります。スクリプトでは次のようになります。

> "file"
command > "file" &
tail -n +1 -F "file"

修正:

元の回答では が使用されていました-n 0が、これは最初は の行を出力しませんが、 の起動後"file"に に追加された行を出力します。これは私の意図したものではなく、間違いでした。の起動前に何らかの行が書き込まれていたとしても、のすべての行をリストするオプションを使用するつもりでした。その動作の正しいオプションは です。"file"tail"file"commandtail-n +1

man ページからtail(1):

   -n, --lines=K は最後の 10 行ではなく、最後の K 行を出力します。
                   または-n +Kを使用してK番目から始まる行を出力します

tail最初の行は、 が の前にファイルにヒットする競合状態の場合に備えて、ファイルの内容をクリアしますcommand

関連情報