Чи можливо поєднувати вихід з цих двох команд?
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- це запускає command1 (на передньому плані), а потім, якщо команда1 вдалася, запускає command2.
Більш загально, можна використовувати або підзаголовки, або групування команд, і перенаправляти результати всієї групи відразу.
Код:
( 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
Виконуючи паралельне виконання, ви хочете, щоб у виходу були повні рядки as, а потім - повні рядки bs. Те, що ви не хочете, - це змішування as і bs на одній лінії ( tr -s abзамінює повторення as одиничним a, тому легше побачити, що відбувається):
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
Якщо ви замість цього використовуєте GNU Parallel, ви отримуєте приємні чисті повні рядки з as або bs, але ніколи не змішуються:
$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a
Новіші версії GNU Parallel навіть уникають наповнення вашого диска.
Для особливого випадку комбінування декількох виходів команд 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 з команд, які не виходять, див. Інші відповіді.)