![異なるスレッドで同時にコンソールとファイルに出力を印刷するコマンド](https://rvso.com/image/1400518/%E7%95%B0%E3%81%AA%E3%82%8B%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%A7%E5%90%8C%E6%99%82%E3%81%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%87%BA%E5%8A%9B%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89.png)
私は 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"
command
tail
-n +1
man ページからtail(1)
:
-n, --lines=K は最後の 10 行ではなく、最後の K 行を出力します。 または-n +Kを使用してK番目から始まる行を出力します
tail
最初の行は、 が の前にファイルにヒットする競合状態の場合に備えて、ファイルの内容をクリアしますcommand
。