在不同线程上同时将输出打印到控制台和文件的命令

在不同线程上同时将输出打印到控制台和文件的命令

我正在编写一个 bash 脚本,希望最后一个命令作为单独的进程启动。最后一个命令还会将所有输出发送到一个文件。但是,我还希望输出仍显示在控制台上。到目前为止,我所做的是,

$ command > "file" &

这会将输出发送到“文件”,并将命令作为其自己的进程启动。但是,我还想同时在控制台中查看输出(但如果我按 ctrl+c 或 w/e,命令不会停止)。这很像这个问题,但有一个条件,它需要有自己的线程。

我努力了:

$ command | tee "file" &

但问题是 tee 是该过程的一部分,并且输出实际上并没有出现。

因此,为了澄清起见,我希望有command自己的进程,将输出发送到文件,但仍让输出出现在控制台中(直到我按下 q、enter、ctrl+c 或其他键)。由于这是在 bash 脚本中,因此可以接受两行单独的代码。

答案1

听起来您想command完成对文件的写入,但又希望能够中断控制台的显示。我会采取不同的解决方案。在您的脚本中:

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

更正:

原始答案使用了-n 0,它最初不输出 行,"file"但输出在 开始"file"后添加到 的任何行tail。这不是我的本意——这是一个错误。我打算使用一个选项来列出 的所有行,"file"即使在 开始command之前已经写了一些tail。该行为的正确选项是-n +1

tail(1)手册页中:

   -n, --lines=K 输出最后 K 行,而不是最后 10 行;
                   或者使用 -n +K 输出以第 K 个开头的行

第一行会在发生竞争条件(在tail之前命中文件)时清除文件的内容command

相关内容