bash에서 두 명령의 출력을 결합하십시오. ~/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

당신은 분리하려는 경우 STDOUTSTDERR두 개의 파일에서 :

{ command1 & command2; } > STDOUT_file 2> STDERR_file

답변

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

암호:

( command1 ; command2 ; command3 ) | cat

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

이 둘의 주요 차이점은 첫 번째 프로세스는 하위 프로세스를 분할하고 두 번째 프로세스는 기본 쉘의 컨텍스트에서 작동한다는 것입니다. 변수 및 기타 환경 설정 및 성능 설정 및 사용과 관련하여 결과가 발생할 수 있습니다.

명령 그룹 (및 함수)에서 닫는 대괄호는 세미콜론이나 개행 문자로 내용과 분리해야합니다. 이 때문입니다 "}"자체의 명령 (키워드) 실제로, 하나처럼 취급해야합니다.


답변

두 번째 명령이 종료되거나 실행되지 않았기 때문에 다른 제안은 효과가 없었습니다.

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
}

답변

이 시도:

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의 전체 라인과 s의 전체 라인을 갖기를 원합니다 b. 당신이 할 수 없습니다 원하는 것은 as와 b같은 줄에 혼합의 ( tr -s ab반복 대체 a들 하나와 함께 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에서도 디스크를 가득 채우지 않아도됩니다. 위의 내용은 영원히 실행될 수 있습니다.


답변

이미를 사용하고 있으므로 동시에node 시도해 볼 수 있습니다

여러 명령을 동시에 실행하십시오. 좋아 npm run watch-js & npm run watch-less하지만 좋아


답변

여러 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

(참고 :이 방법은 명령이 종료 된 경우에만 작동합니다. 종료되지 않은 명령의 표준 출력을 결합하려면 다른 답변을 참조하십시오.)