将在一个终端中同时运行的两个命令的输出写入文件

将在一个终端中同时运行的两个命令的输出写入文件

我需要将一个终端中一起运行的两个命令的输出写入文件,如上例所示,或者当第二个命令也在运行时,记录第一个命令的输出——该怎么做?

sudo btmon ; sudo hcitool lescan

我尝试过类似

{ sudo btmon ; sudo hcitool lescan ;} > file.txt 但 id 没有给出两者。为了解决这个问题,我在两个不同的终端中运行它们

sudo btmon > file.txt从一个

sudo hcitool lescan来自另一个

而且它以我接受的方式工作,我需要从第一个命令开始记录。但我想在一个终端中只用一种字符串来完成所有操作,我知道这是可能的。唯一的问题是如何完成它?

答案1

因为似乎没人回答,所以我来回答一下。我将使用此来源

解决办法见评论

(sudo btmon & sudo hcitool lescan ) &> scan_log.txt

它使用()而不是{}。此外,&> 表示不仅会转发 STDOUT,还会转发 STDERR。因为似乎其中一个工具使用 STDERR 进行输出,所以这是必要的。我想从评论中稍微解释一下问题,因此我将首先解释()和之间的区别{}

(命令)

将命令列表放在括号之间会导致创建一个子 shell,并且列表中的每个命令都会在该子 shell 中执行,而不会删除未导出的变量。

由于列表是在子 shell 中执行的,因此变量赋值在子 shell 完成后不再有效。

{ 命令; }

将命令列表放在花括号之间会导致列表在当前 shell 上下文中执行。不会创建子 shell。列表后面的分号(或换行符)是必需的。

除了创建子 shell 之外,由于历史原因,这两种构造之间还有一个细微的差别。大括号是保留字,因此必须用空格将它们与列表分隔开。圆括号是运算符,即使它们没有用空格与列表分隔开,shell 也会将它们识别为单独的标记。

回顾第一个建议,原帖者只是忘记了;因为列表后面的分号(或换行符)是必需的。因此以下两种解决方案都应该可以解决问题:

{ sudo btmon; sudo hcitool lescan; } &> scan_log.txt

(sudo btmon & sudo hcitool lescan) &> scan_log.txt

相关内容