Запись в файл вывода двух команд, работающих вместе в одном терминале
Мне нужно записать в файл выходные данные двух команд, запущенных вместе в одном терминале, как в примере выше, ИЛИ записать в журнал вывод первого, когда вторая тоже выполняется - как это сделать?
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