停止录制而不停止其余脚本

RBI*_*RBI 5 bash

我正在玩使用Google语音文本API的脚本。该api需要flac编码的文件,因此脚本的记录部分如下所示:

arecord -q -t wav -d 0 -f S16_LE -r 16000 | flac - -f --best --sample-rate 16000 -s -o "$TEMP_FILE"
Run Code Online (Sandbox Code Playgroud)

该命令将一直记录,直到用户使用ctrl-c退出,并且应将wav记录的格式以flac格式通过管道传送到flac程序以输出,然后该脚本应继续。

我遇到的问题是,按ctrl-c会完全结束脚本,并切断某些音频(flac文件仍会输出)。如果我在不使用管道的情况下运行脚本:

arecord -q -t wav -d 0 -f S16_LE -r 16000 some.wav
Run Code Online (Sandbox Code Playgroud)

然后按ctrl-c只会结束录制,并继续执行脚本。

如何解决此问题,以便ctrl-c仅停止arecord命令并允许脚本的其余部分(包括管道flac编码)完成?

mkl*_*nt0 5

我认为你想做的事情无法完成

免责声明:以下内容基于我自己在 Ubuntu 12.04 上的实验,仅进行了一些研究。如果我错了请告诉我。

症结所在:

  • Ctrl-C在管道运行时按下会SIGINT向管道中的所有进程发送信号。
  • 不保证进程接收信号顺序。
  • 除非管道中的所有进程都捕获信号,否则脚本将作为一个整体中止(尽管脚本本身可以使用命令捕获信号trap- 但这样的 shell 陷阱只有管道进程收到信号并具有通常被它终止)。

您的具体情况下,arecord旨在以有序的方式捕获和退出作为响应 相比之下,似乎没有——它被强制终止。 然而,即使也确实陷阱彻底关闭,考虑到所涉及的进程接收信号的顺序不确定,您也无法安全地使用管道,同时期望整个处理以有序的方式完成。 SIGINT
flac
flacSIGINTCtrl-C

(顺便说一句:用终止时arecord会报告退出代码,这让我想知道如何将其与真正的故障区分开来,例如磁盘空间不足。)1Ctrl-C

因此:

  • arecord作为单独的命令调用并捕获(临时)文件中的输出。
  • 然后,将(临时)文件传递给flac(并在完成后删除临时文件)。