Можно ли объединить вывод этих двух команд?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Ни одна из команд не завершается, поэтому я не уверен, как это сделать.
bash
io-redirection
chovy
источник
источник
Ответы:
Вы можете объединить две команды, сгруппировав их с
{ }
:пока что вы можете перенаправить группу в файл (последний
;
перед}
обязательным):если вы хотите разделить
STDOUT
иSTDERR
на два файла:источник
;
перед тем}
, это обязательно!{ yes {1..20} & yes {1..20}; } | grep -v '^1 2 3'
идеале, ничего не печатать, если строки не разбиты.&&
вместо&
!command1 & command2
- это запускает команду 1 в фоновом режиме и немедленно запускает команду 2, таким образом выполняя обе команды параллельно и портя вывод.command1 && command2
- при этом запускается команда 1 (на переднем плане), а затем, если команда 1 выполнена, запускается команда 2.В более общем смысле можно использовать либо подоболочку, либо группирование команд и перенаправить вывод всей группы сразу.
Код:
( command1 ; command2 ; command3 ) | cat
{ command1 ; command2 ; command3 ; } > outfile.txt
Основное различие между ними состоит в том, что первый разделяет дочерний процесс, а второй работает в контексте основной оболочки. Это может иметь последствия в отношении настройки и использования переменных и других параметров среды, а также производительности.
Не забывайте, что закрывающая скобка в группировании команд (и функций) должна быть отделена от содержимого точкой с запятой или новой строкой. Это потому, что
"}"
на самом деле это отдельная команда (ключевое слово), и должна рассматриваться как одна.источник
( )
работает тоже отлично.}
не команда вообще. Это зарезервированное слово. То же самое и для{
. Я обычно пишу такие списки , как так:{ command1;command2;} > outfile.txt
. Вы можете добавить пробелы после точки с запятой, но это не обязательно. Пространство после{
является необходимым, хотя.( yes {1..20} & yes {1..20}; ) | grep -v '^1 2 3'
идеале, ничего не печатать, если строки не разбиты. (H / T в @antak).( command1 && command2 && command3 ) | cat
()
как с фигурными скобками{}
это работает как фоновый прогресс, а затем вам придется иметь дело с выводом из этого. Также труба для кошки `| cat` - более хорошая альтернатива, чем `> / dev / stdout`Я закончил тем, что делал это, другие предложения не работали, поскольку 2-я команда была либо убита, либо никогда не выполнялась.
источник
tail -f *.log
хотя я никогда не видел это как проблему с двумя разными процессами, записывающими в один и тот же файл журнала.yes {1..20}
command2 =yes {1..20}
и передать объединенный вывод,| grep -v '^1 2 3'
который в идеале не будет ничего печатать, если строки не разбиты. (H / T в @antak).Попробуй это:
источник
Большинство решений до сих пор плохо справляются с проблемой частичной линии. Предположим на секунду, что программы:
При параллельном запуске вы хотите, чтобы в выводе были полные строки
a
s, а затем полные строкиb
s. То, что вам не нужно, это смешиваниеa
s иb
s в одной строке (tr -s ab
замена повторяющихсяa
s однойa
, чтобы было легче увидеть, что происходит):Если вместо этого вы используете GNU Parallel, вы получите хорошие чистые полные строки с
a
s илиb
s, но никогда не будете смешаны:Более новые версии GNU Parallel даже избегают заполнения вашего диска: вышеописанное может работать вечно.
источник
Поскольку вы уже используете
node
, вы можете попробовать одновременноисточник
Для особого случая объединения нескольких выходов команды BASH в одну строку приведен рецепт выполнения каждой команды по очереди, удаляя любые переводы строк между их выходами.
В качестве реального примера приведенный ниже код будет вставлять сообщение ASCII между двумя фиксированными строками байтов (в данном случае формируя команду печати).
(Примечание: этот метод работает, только если команды завершаются. Для объединения stdout из команд, которые не выходят, см. Другие ответы.)
источник