git clone
다음 명령을 실행 중이며 sudo
STDOUT 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.
sudo
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; 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)csh
2>&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