어떤 출력이 stderr로 전송되었는지 즉시 알려줍니다.


8

작업을 자동화 할 때는 먼저 수동으로 테스트하는 것이 좋습니다. 그러나 stderr로가는 데이터가 즉시 인식 가능하고 stdout으로가는 데이터와 구별 가능하고 모든 출력을 함께 가지고 있으면 이벤트 순서가 무엇인지 알 수 있다면 도움이 될 것입니다.

프로그램 종료시 리턴 코드를 인쇄하면 좋을 것입니다.

이 모든 것들이 자동화에 도움이 될 것입니다. 예, 프로그램이 끝나면 리턴 코드를 에코 할 수 있으며, stdout 및 stderr을 리디렉션 할 수 있습니다. 내가 정말로 좋아하는 것은 stdout을 검은 색으로 표시하고 stderr을 빨간색으로 인터리브하고 종료 코드를 인쇄하는 쉘, 스크립트 또는 사용하기 쉬운 리디렉터입니다.

그런 짐승이 있습니까? [중요하다면 Mac OS X에서 Bash 3.2를 사용하고 있습니다].


업데이트 : 내가 이것을 본 지 몇 달이 지났습니다. 간단한 테스트 스크립트를 생각해 냈습니다.

#!/usr/bin/env python
import sys

print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"

내 테스트에서 (아마도 버퍼링 방식으로 인해) rse와 hilite는 stdout의 모든 것을 표시 한 다음 stderr의 모든 것을 표시합니다. fifo 방법은 순서를 올바르게하지만 stderr 라인을 따르는 모든 것을 채색하는 것처럼 보입니다. ind는 내 stdin 및 stderr 라인에 대해 불평 한 다음 stderr의 출력을 마지막에 넣습니다.

이러한 솔루션의 대부분은 마지막 출력 만 stderr로 이동하는 것은 비정형 적이 지 않지만 여전히 약간 더 나은 것을 갖는 것이 좋습니다.


나처럼 게 으르거나 손가락이 아프면 아래 솔루션 (예 : rse zsh)으로 서브 쉘을 잡고 이제 모든 명령으로 stderr을 채색 할 수 있습니다.
4:43에

답변:


3

stderred를 확인할 수도 있습니다 : https://github.com/sickill/stderred


불행히도, OP와 같은 Mac 사용자에게는 stderred가 "open"과 "mvim"을 깨뜨립니다.
AlcubierreDrive

이것은 매우 훌륭하게 작동하며 작동 방식으로 인해 올바른 순서로 출력 순서를 얻습니다. 한 번 설정하고 프로필에서 켜면 stderr가 작성 될 때마다 빨간색 메시지가 표시됩니다.
클린턴 블랙 모어


9

방금 FIFO와 관련된 미친 방법을 고안했습니다.

$ mkfifo foo
$ grep --color . foo &
$ your_command 2>foo

stderr 출력을 분리하려면 두 개의 별도 쉘을 열고 grep --color . foo하나없이 " " &를 실행 한 다음 다른 명령어를 실행하십시오 (여전히 2>foo). 당신은 stderr을 grep하나에, stdout을 메인 것으로 가져옵니다.

이것은 stderr 출력이 FIFO를 통해 grep --color기본 색상이 빨간색 (적어도 나를 위해) 인으로 라우팅되기 때문에 작동합니다 . 완료되면 rmFIFO ( rm foo) 만 있습니다.

주의 사항 : 출력 순서를 어떻게 처리 할 지 잘 모르겠습니다. 테스트해야합니다.


꽤 매끄 럽습니다.
클린턴 블랙 모어

7

예, 가능합니다. 실제 예제를 보려면 이 사이트의 "STDERR 빨간색으로 만들기" 섹션을 참조하십시오 .

기본 코드는 이쪽

# Red STDERR
# rse <command string>
function rse()
{
    # We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace
    # Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back
    ((eval $(for phrase in "$@"; do echo -n "'$phrase' "; done)) 3>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}

함수 자체에 간단한 설명이 있습니다. STDOUT과 STDERR을 움직이면 sed 가 STDERR을 1로 가져 와서 색을 칠한 다음 다시 바꿉니다. 여기서 파일 스트림 3을 임시 변수로 생각하십시오.

전화는 매우 간단합니다

rse commands

그러나 특정 호출은 예상대로 작동하지 않습니다. 경고는 모두 링크 된 페이지에 제공됩니다.

Btw, 나는 형태의 해결책을 가지고 오는 것이 가능하다고 생각합니다.

commands | rse 

여기서 rse는 출력을 채색합니다.

나는 또한이 일을 하는 것처럼 보이는 이 hilite 프로젝트를 발견 했습니다. 나는 그것을 시도하지 않았지만 그것은 당신이 찾고있는 것일 수 있습니다.

hilite는 stderr에 인쇄 된 내용을 강조 표시하여 지정한 명령을 실행하는 작은 유틸리티입니다. 주로 빌드와 함께 사용하도록 설계되어 경고 및 오류가 아픈 진부한 것처럼 튀어 나오도록합니다.

다른 관련 프로젝트 :


rse와 hilite는 내가 원하는 것에 매우 가깝습니다.
클린턴 블랙 모어

1

다른 프로그램이 있습니다 :

http://www.habets.pp.se/synscan/programs.php?prog=ind (하이퍼 링크를 직접 조립해야하며, 답변 당 하나 이상의 포인트가 충분하지 않습니다). 스크린 샷과 스크린 캐스트도 있습니다.

하위 프로세스를 pty로 실행하지만 다른 프로세스는 그렇지 않습니다. stderr이 터미널에서 즉시 플러시되고 tty가 아닌 경우 stdout이 완전히 버퍼링되므로 순서가 중요한 위치 (자주하는 경우)가 중요합니다.

자세한 설명은 다음을 참조하십시오 : http://blog.habets.pp.se/2008/06/Buffering-in-pipes

또한 ind는 대화식 프로그램 및 제어 문자와 함께 작동합니다. "ind bash -i"로 시작할 때 Bash는 정상적으로 작동합니다.

이것은 Ctrl-P et.al을 유지하면서 색상을 줄 수 있습니다.

ind -P $(echo -ne '\033[31;1m') -p $(echo -ne '\033[0m') bash -i

1

다음은 stderr 출력을 강조 표시하기위한 많은 응답입니다. 한 줄에 하나만 추가하면 명령에 첨부 할 수 있습니다.

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m"; done)

그러나 매번 명령 후에 이것을 추가해야합니다.

개인적으로 @nagul에서 언급 한 가능성과 같이 rse 함수는 bashrc에 추가되었습니다.

그러나 종료 코드를 인쇄하기위한 솔루션을 추가하고 싶습니다. 이 값을 bash 프롬프트 행의 시작 부분에 추가 할 수 있습니다.

hostname$ command
  Some error occurred. Returned exit code.
EC hostname$

여기서 EC는 명령의 종료 코드입니다.

종료 코드가 0 일 때 인쇄되지 않지만 다음 프롬프트 전에 빨간색으로 다른 값이 인쇄되도록 설정했습니다.

전체 트릭은 ~ / .bashrc에서 수행됩니다.

my_prompt() {
 EXITSTATUS="$?"
 RED="\[\033[1;31m\]"
 OFF="\[\033[m\]"

PROMPT="${debian_chroot:+($debian_chroot)}\h \$ "

if [ "${EXITSTATUS}" -eq 0 ]; then
   PS1="${PROMPT}"
else
   PS1="${RED}$EXITSTATUS${OFF} ${PROMPT}"
fi
}

PROMPT_COMMAND=my_prompt

프롬프트 라인은 기본적으로 PS1 변수에 의해 정의됩니다. 여기에있는 것을 PROMPT 변수에 복사 한 다음 종료 코드가 있거나없는 PS1 변수를 만듭니다.

Bash는 프롬프트에서 PS1 변수에 정보를 표시합니다.


이것이 바로 내가 찾던 것입니다. 감사합니다!
일론

1

있다 annotate-output 유틸리티 ( devscripts당신이 색상없이 그것을 좋아하면, 데비안 패키지)

$ annotate-output /tmp/test.py    
14:24:57 I: Started /tmp/test.py
14:24:57 E: this is stderr
14:24:57 O: this is stdout
14:24:57 O: this is stdout again
14:24:57 I: Finished with exitcode 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.