Чи можливо поєднувати вихід з цих двох команд?
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
Виконуючи паралельне виконання, ви хочете, щоб у виходу були повні рядки 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 навіть уникають наповнення вашого диска.
Для особливого випадку комбінування декількох виходів команд 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 з команд, які не виходять, див. Інші відповіді.)