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