Можно ли объединить вывод этих двух команд?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Ни одна из команд не завершается, поэтому я не уверен, как это сделать.
Можно ли объединить вывод этих двух команд?
node ~/projects/trunk/index.js
python ~/projects/trunk/run.py run
Ни одна из команд не завершается, поэтому я не уверен, как это сделать.
Ответы:
Вы можете объединить две команды, сгруппировав их с { }
:
{ command1 & command2; }
пока что вы можете перенаправить группу в файл (последний ;
перед }
обязательным):
{ command1 & command2; } > new_file
если вы хотите разделить STDOUT
и STDERR
на два файла:
{ command1 & command2; } > STDOUT_file 2> STDERR_file
;
перед тем }
, это обязательно!
{ 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-я команда была либо убита, либо никогда не выполнялась.
alias app () {
nohup python ~/projects/trunk/run.py run 1>/tmp/log 2>&1 &
echo $! > /tmp/api.pid
nohup node ~/projects/trunk/index.js 1>/tmp/log 2>&1 &
echo $! > /tmp/client.pid
tail -f /tmp/log
}
tail -f *.log
хотя я никогда не видел это как проблему с двумя разными процессами, записывающими в один и тот же файл журнала.
yes {1..20}
command2 = yes {1..20}
и передать объединенный вывод, | grep -v '^1 2 3'
который в идеале не будет ничего печатать, если строки не разбиты. (H / T в @antak).
Попробуй это:
paste $(node ~/projects/trunk/index.js) $(python ~/projects/trunk/run.py run) > outputfile
Большинство решений до сих пор плохо справляются с проблемой частичной линии. Предположим на секунду, что программы:
cmd1() {
perl -e 'while(1) { print "a"x3000_000,"\n"}'
}
export -f cmd1
cmd2() {
perl -e 'while(1) { print "b"x3000_000,"\n"}'
}
export -f cmd2
При параллельном запуске вы хотите, чтобы в выводе были полные строки a
s, а затем полные строки b
s. То, что вам не нужно, это смешивание a
s и b
s в одной строке ( tr -s ab
замена повторяющихся a
s одной a
, чтобы было легче увидеть, что происходит):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Если вместо этого вы используете GNU Parallel, вы получите хорошие чистые полные строки с a
s или b
s, но никогда не будете смешаны:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Более новые версии GNU Parallel даже избегают заполнения вашего диска: вышеописанное может работать вечно.
Поскольку вы уже используете node
, вы можете попробовать одновременно
Выполнить несколько команд одновременно. Нравится,
npm run watch-js & npm run watch-less
но лучше.
Для особого случая объединения нескольких выходов команды BASH в одну строку приведен рецепт выполнения каждой команды по очереди, удаляя любые переводы строк между их выходами.
(echo 'ab' && echo 'cd' && echo 'ef') | tr -d '\n'
>>> abcdef
В качестве реального примера приведенный ниже код будет вставлять сообщение ASCII между двумя фиксированными строками байтов (в данном случае формируя команду печати).
# hex prefix encode a message as hex hex suffix | strip newline | hex to binary | (then, for example, send the binary over a TCP connection)
(echo '1b40' && echo "Test print #1" | xxd -p && echo '1d564103') | tr -d '\n' | xxd -r -p | nc -N 192.168.192.168 9100
(Примечание: этот метод работает, только если команды завершаются. Для объединения stdout из команд, которые не выходят, см. Другие ответы.)