Запись в файл вывода двух команд, работающих вместе в одном терминале

Мне нужно записать в файл выходные данные двух команд, запущенных вместе в одном терминале, как в примере выше, ИЛИ записать в журнал вывод первого, когда вторая тоже выполняется - как это сделать?

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 для вывода, так что это было необходимо. Я хочу объяснить проблемы из комментариев, поэтому я объясню разницу между () а также {} первый.

(Команда)

Размещение списка команд в скобках приводит к созданию подоболочки, и каждая из команд в списке должна выполняться в этой подоболочке, не удаляя неэкспортированные переменные.

Поскольку список выполняется в подоболочке, назначения переменных не остаются в силе после завершения подоболочки.

{команда; }

Помещение списка команд в фигурные скобки приводит к тому, что список выполняется в текущем контексте оболочки. Никакая подоболочка не создана. Точка с запятой (или новая строка) следующий список обязателен.

В дополнение к созданию подоболочки, между этими двумя конструкциями есть небольшая разница по историческим причинам. Скобки являются зарезервированными словами, поэтому они должны быть отделены от списка пробелами. Круглые скобки являются операторами и распознаются оболочкой как отдельные токены, даже если они не отделены от списка пробелами.

Возвращаясь к первому предложению, ОП просто забыл ; потому что точка с запятой (или символ новой строки) следующий список обязателен. между {}, поэтому оба следующих решения должны решить проблему:

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

(sudo btmon & sudo hcitool lescan) &> scan_log.txt
Другие вопросы по тегам