이 두 명령의 출력을 병합할 수 있습니까?
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
. 당신이 무엇을아니요a
s와 b
s가 같은 줄에 혼합되기를 원합니다 ( tr -s ab
반복되는 s를 단일 s로 바꾸면 무슨 일이 일어나는지 더 쉽게 볼 수 있습니다):a
a
# This is bad - half lines are mixed
$ (cmd1 & cmd2 ) | tr -s ab
bababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
GNU Parallel을 사용하면 a
s 또는 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