Я должен записать в вывод файла двух команд, работающих вместе в одном терминале как пример выше, ИЛИ регистрирующих вывод сначала, когда второе также работает - как сделать это?
sudo btmon ; sudo hcitool lescan
Я попробовал что-то как
{ sudo btmon ; sudo hcitool lescan ;} > file.txt
но идентификатор не дал из обоих. Как работают вокруг, я выполняю их в двух различных терминалах
sudo btmon > file.txt
от одного
и
sudo hcitool lescan
от другого
и это работало способом, я принимаю, у меня был журнал потребности от первой команды. Но я хочу иметь все это в одном терминале только с своего рода одной строкой, и я знаю, что это возможно. Единственный вопрос состоит в том, как он сделан?
Так как никто, казалось, не создал ответ, я сделаю это. Я буду использовать извлечения этого источника
Решение в комментариях
(sudo btmon & sudo hcitool lescan ) &> scan_log.txt
Это использует ()
вместо {}
. Также и> означает, что не только STDOUT, но также и STDERR будут переданы. Поскольку кажется, что один из тех инструментов использовал STDERR для вывода, таким образом, это было необходимо. Я хочу объяснить проблемы из комментариев немного поэтому, я объясню различие между ()
и {}
сначала.
(команда)
Размещение списка команд между круглыми скобками заставляет подоболочку быть созданной, и каждая из команд в списке, который будет выполняться в той подоболочке, не удаляя неэкспортируемые переменные.
Так как список выполняется в подоболочке, переменные присвоения не остаются в силе после того, как подоболочка завершается.
{команда;}
Размещение списка команд между фигурными скобками заставляет список выполняться в текущем контексте оболочки. Никакая подоболочка не создается. Точка с запятой (или новая строка) после списка требуется.
В дополнение к созданию подоболочки существует тонкое различие между этими двумя конструкциями из-за исторических причин. Фигурные скобки являются зарезервированными словами, таким образом, они должны быть разделены от списка пробелами. Круглые скобки являются операторами и распознаны как отдельные маркеры оболочкой, даже если они не разделяются от списка пробелом.
При оглядывании назад к первому предложению OP просто забыл ;
потому что точка с запятой (или новая строка) после списка требуется. между {}, таким образом, оба из следующих решений должны решить проблему:
{ sudo btmon; sudo hcitool lescan; } &> scan_log.txt
(sudo btmon & sudo hcitool lescan) &> scan_log.txt