输出位于控制台中,但不是 stdout 或 stderr 的一部分

输出位于控制台中,但不是 stdout 或 stderr 的一部分

我有一个输出以下内容的命令:

READY
Listening....
HELLO
READY
Listening....
TEST

它是来自 的语音识别pocketsphinx_continuous

我需要将输出重定向到一个文件,它似乎不是来自stdout或,stderr因为我尝试添加1>log.txtand 2>log.txt,每次它们都是空白的。

这是关键:当我添加1>log.txt到命令时,控制台不再有任何输出,但log.txt仍然是空白。

另外,当我添加| tee log.txt它时才不是显示在控制台中,文件仍然是空白的。

此输出是否来自stdout,如果是,为什么它不被重定向到文件?

这个问题与我的另一个问题相关:将 Pocketsphinx_continuous 的输出重定向到文件

Pocketsphinx 很奇怪,使用它的参数来重定向输出对我来说是不可能的,在这个问题中我只想知道这个输出来自哪里sdtoutsdterr其他地方,以及如何重定向该输出。

编辑

ls -l /proc/PID/fd/返回:

lrwx------ 1 pi pi 64 Jan  4 04:12 0 -> /dev/pts/2
lrwx------ 1 pi pi 64 Jan  4 04:12 1 -> /dev/pts/2
lrwx------ 1 pi pi 64 Jan  4 04:11 2 -> /dev/pts/2
lrwx------ 1 pi pi 64 Jan  4 04:12 4 -> /dev/snd/pcmC0D0c

答案1

可怕的命令:

script -q -f -c "pocketsphinx_continuous -samprate 48000 -nfft 2048 -hmm /usr/local/share/pocketsphinx/model/en-us/en-us -lm 9745.lm -dict 9745.dic -inmic yes -logfn /dev/null" words.txt &

对我有用,它记录:

READY....
Listening...
HELLO

到文件中,很容易清除不需要的东西。

编辑: 如果将来有人自己执行此操作,&如果您在控制台中执行它,请删除该命令末尾的 ;如果您通过 Python 或其他语言执行它,请保留末尾的&

答案2

linux手册页面说

当且仅当流不引用交互设备时,标准输入和输出流才被完全缓冲。

因此,在输出中显示某些内容之前,您可能需要生成大量输出(4096 字节)。

如果有一种常规方法可以停止 pocketsphinx,并且正确实现,那么当您停止它时,它应该将缓冲区刷新到输出文件。这至少可以证明缓冲理论,但当然它还不能帮助您及时获得输出。

这个答案或其他人针对相应的问题可能会有所帮助。

相关内容