하위 프로세스의 출력을 리디렉션하는 방법은 무엇입니까?

하위 프로세스의 출력을 리디렉션하는 방법은 무엇입니까?

git clone다음 명령을 실행 중이며 sudoSTDOUT bash을 로그 파일로 리디렉션하고 싶습니다.

% sudo -u test_user bash -c "git clone https://github.com/scrooloose/nerdtree.git
/home/test_user/.vim/bundle/nerdtree >> /var/log/build_scripts.log"

무슨 일이 일어나는지는 STDOUT이 계속해서 터미널로 전송된다는 것입니다. 즉

Cloning into 'nerdtree'...
remote: Counting objects: 3689, done.
[...]
Checking connectivity... done.

sudobash문제 는 다음과 같이 새 프로세스를 포크한 다음 다른 프로세스를 포크하는 것과 관련이 있는 것 같습니다 .

% sudo -u test_user bash -c "{ git clone https://github.com/scrooloose/nerdtree.git
/home/test_user/.vim/bundle/nerdtree >> /var/log/build_scripts.log; ps f -g$$; }"  

  PID TTY      STAT   TIME COMMAND
 6556 pts/25   Ss     0:02 /usr/bin/zsh
 3005 pts/25   S+     0:00  \_ sudo -u test_user bash -c { git clone https://github.com/scrooloo
 3006 pts/25   S+     0:00      \_ bash -c { git clone https://github.com/scrooloose/nerdtree.
 3009 pts/25   R+     0:00          \_ ps f -g6556

나는 노력했다

  • 스크립트에서 실행하고 exec >> /var/log/build_script.log명령 전에 사용하십시오.
  • 명령을 함수로 래핑한 다음 함수 출력을 호출하고 리디렉션합니다.

그러나 이러한 리디렉션은 상위 프로세스에만 적용된다고 생각합니다. 하위 프로세스는 /dev/tty/25기본적으로 STDOUT을 상위 프로세스로 보내 출력이 터미널로 계속 진행되도록 합니다.
이 명령의 STDOUT을 어떻게 리디렉션할 수 있나요?

답변1

언급한 메시지는 표준 출력으로 인쇄되지 않고 표준 오류로 인쇄됩니다. 따라서 이를 포착하려면 표준 출력 대신 표준 오류를 리디렉션해야 합니다.

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo 2>> log"

또는 STDERR 및 STDOUT:

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo >> log 2>&1"

Pass 를 사용하면 다음 방법을 bash사용할 수도 있습니다 .&>>

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo &>> log"

csh, tcsh, zsh동등( 지원되지 >>&않으므로 이것이 유일한 방법입니다):(t)csh2>&1

sudo -u user csh -c "git clone https://github.com/foo.git ~/foo >>& log"

존재하다fish

sudo -u user fish -c "git clone https://github.com/foo.git ~/foo >> log ^&1"

다양한 유형의 리디렉션 연산자에 대한 자세한 내용은 다음을 참조하세요.쉘의 제어 및 리디렉션 연산자는 무엇입니까?

이제 특정한 경우에는 git또 다른 문제가 있습니다. 일부 다른 프로그램과 마찬가지로 git출력이 리디렉션되고 있음을 감지하고, 그렇다면 진행 보고서 인쇄를 중지할 수 있습니다. 이는 보고서가 실시간으로 표시되도록 설계되었으며 \r파일에 저장할 때 문제를 일으킬 수 있는 보고서가 포함되어 있기 때문일 수 있습니다. 이 문제를 해결하려면 다음을 사용하십시오.

       --progress
       Progress status is reported on the standard error stream by default
       when it is attached to a terminal, unless -q is specified. This
       flag forces progress status even if the standard error stream is
       not directed to a terminal.

그리고:

sudo -u user bash -c "git clone --progress https://github.com/foo.git ~/foo >> log 2>&1"

출력을 동시에 보고 싶다면그리고파일에 저장하려면 다음을 사용하십시오 tee.

sudo -u user bash -c "git clone --progress https://github.com/foo.git ~/foo 2>&1 | 
    tee -a log

답변2

git clone https://github.com/scrooloose/nerdtree.git
/home/test_user/.vim/bundle/nerdtree &>> /var/log/build_scripts.log

관련 정보