이 두 명령의 출력을 결합 할 수 있습니까?
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
-백그라운드에서 command1을 실행하고 command2를 즉시 시작하여 두 명령을 병렬로 실행하고 출력을 엉망으로 만듭니다. command1 && command2
-이것은 command1 (포 그라운드)을 실행 한 다음 command1이 성공하면 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`
두 번째 명령이 종료되거나 실행되지 않았기 때문에 다른 제안은 효과가 없었습니다.
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
동일한 로그 파일에 쓰는 2 개의 다른 프로세스의 문제로 본 적이 없지만.
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의 전체 라인과 s의 전체 라인을 갖기를 원합니다 b
. 당신이 할 수 없습니다 원하는 것은 a
s와 b
같은 줄에 혼합의 ( tr -s ab
반복 대체 a
들 하나와 함께 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
(참고 :이 방법은 명령이 종료 된 경우에만 작동합니다. 종료되지 않은 명령의 표준 출력을 결합하려면 다른 답변을 참조하십시오.)