Bash에서 두 명령의 출력 병합

Bash에서 두 명령의 출력 병합

이 두 명령의 출력을 병합할 수 있습니까?

node ~/projects/trunk/index.js 
python ~/projects/trunk/run.py run

두 명령 모두 종료되지 않으므로 이 작업을 수행하는 방법을 모르겠습니다.

답변1

두 명령을 그룹화하여 결합할 수 있습니다 { }.

{ command1 & command2; }

지금까지는 그룹을 파일(마지막 것 ;앞에는 }필수), 여는 괄호와 닫는 괄호 사이의 공간도 마찬가지입니다..

{ command1 & command2; } > new_file

STDOUT합계를 STDERR두 개의 파일로 분할 하려는 경우 :

{ command1 & command2; } > STDOUT_file 2> STDERR_file

백그라운드에서 첫 번째 명령을 실행하지 않으려면 다음 형식을 사용하십시오.

{ command1; command2; }

또는

{ command1 && command2; }

첫 번째 명령이 성공한 경우에만 두 번째 명령을 실행합니다.

답변2

보다 일반적으로는 하위 쉘이나 명령 그룹을 사용하고 전체 그룹의 출력을 한 번에 리디렉션할 수 있습니다.

암호:

( command1 ; command2 ; command3 ) | cat

{ command1 ; command2 ; command3 ; } > outfile.txt

둘 사이의 주요 차이점은 첫 번째 프로세스가 하위 프로세스로 분할되는 반면 두 번째 프로세스는 기본 셸의 컨텍스트에서 실행된다는 것입니다. 이는 변수의 설정 및 사용과 기타 환경 설정 및 성능에 영향을 미칠 수 있습니다.

명령 그룹(및 함수)의 닫는 괄호는 세미콜론이나 줄 바꿈으로 내용과 구분되어야 한다는 점을 잊지 마십시오. "}"실제로는 명령(키워드)이므로 명령처럼 취급해야 하기 때문입니다 .

답변3

현재까지 대부분의 솔루션은 일부 배선 문제를 제대로 해결하지 못했습니다. 이러한 프로그램은 다음과 같다고 가정합니다.

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. 당신이 무엇을아니요as와 bs가 같은 줄에 혼합되기를 원합니다 ( tr -s ab반복되는 s를 단일 s로 바꾸면 무슨 일이 일어나는지 더 쉽게 볼 수 있습니다):aa

# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab

GNU Parallel을 사용하면 as 또는 s를 사용하여 b깨끗하고 깔끔한 전체 라인을 얻을 수 있지만 혼합은 없습니다.

$ parallel --line-buffer ::: cmd1 cmd2 | tr -s ab
a
a
b
b
b
b
a

최신 버전의 GNU Parallel은 디스크를 채우는 일도 방지합니다. 위의 코드는 영원히 실행됩니다.

답변4

cat허용된 답변의 출력이 올바른 순서로 표시되지 않을 수 있습니다. 소스가 비동기식인 경우(예: 또는 curl) 사용하지 마세요.

대신 이것을 사용하십시오:

cat <(command1) <(command2) <(command3) > output.txt

실제 사례:

cat \
<(curl https://stackoverflow.com/humans.txt) \
<(echo -e "\n\nDownloaded from https://stackoverflow.com") \
> output.md

생산

There's a bunch of humans behind Stack Overflow and the network of Stack Exchange sites. If you'd like to join us check out https://stackoverflow.com/company/work-here

Downloaded from https://stackoverflow.com

관련 정보