리눅스 덜 행동과 stderr


11

와 함께 복잡한 명령의 출력을보고 있습니다. less문제는 stderr잃어 버린 것입니다. stderr라인은 일반적으로 stdout내부 라인 사이에 나열됩니다 less. 콘솔에 인쇄하고 종료 할 때 less함께 볼 수 있기를 바랍니다.

나는이에 대한 해결책이 없을 수도 있습니다 실현, 나는에 대해 읽어 tee하고 multitee있지만 행운까지.


2
stderr를 stdout으로 리디렉션하는 방법을 알려주고 있지만 그것이 내가 원하는 것이 아닙니다. stderr이 stdout과 덜 섞이는 것을 원하지 않습니다. 덜 나가면 stderr이 터미널에 있기를 바랍니다.

경우 stderr에 리디렉션 stdout, 모든 출력이 stderr 됩니다 에 정상 출력과 혼합 stdout. 해당 출력을 파이핑하면 less둘 다 표시됩니다.
일부 프로그래머 친구

"내가 덜 나가면 터미널에 있어야하는 stderr"를 무시하면 Ctrl-L을 눌러 less화면을 다시 칠하는 것이 좋습니다 .
kamae

답변:


10

아마도

command 2> command.err | less; cat command.err; rm command.err

추가

다음은 주의 깊게 질문을 읽지 않고 위의 OP의 명확한 설명을 읽지 않은 사람들을위한 설명입니다 .

haelix는 지적했다.

stderr 라인은 일반적으로 stdout 라인 사이에 나열됩니다.

그리고 초기 답변자에 대한 의견에서 다음과 같이 썼습니다.

stderr를 stdout으로 리디렉션하는 방법을 알려주고 있지만 그것이 내가 원하는 것이 아닙니다. stderr이 stdout과 덜 섞이는 것을 원하지 않습니다. 덜 나가면 stderr이 터미널에 있기를 바랍니다.

문제는 아마도 플랫폼마다 다르며, 구형 Unix SVR4 플랫폼에서 경험 한 것입니다.

그러한 플랫폼에서 다음과 같은 일을하면

 find / ... | less

모든 오류 메시지 (예 : 디렉토리 권한)는 다음과 같이 적게 나타납니다.

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

오류 메시지로 인해 출력 라인이 가려집니다.

페이지를 새로 고치면 출력 행이 올바르게 표시되지만 오류 메시지가 손실됩니다. 종료하면 명령 프롬프트를 제외하고 화면이 지워집니다.

당신이 같은 것을하면

  find / ... 2>&1 | less

오류 메시지는 표준 출력과 섞여 있습니다. 다시 종료하면 화면이 비어 있습니다.

먼저 표준 출력 만 적게 사용하고 덜 종료 한 후 오류 메시지를 보려면 다른 솔루션이 필요합니다.

그것이 원래의 2 줄 대답에서 잠정적으로 제안한 것입니다.


이것은 쓰레기입니다. 요아킴의 대답이 받아 들여 져야합니다.
바닐라 얼굴

2
@ VanillaFace : 내 대답에 명확한 설명을 추가했습니다.
RedGrittyBrick

16

다음으로 리디렉션 stderr해야합니다 stdout.

$ ./somecommad 2>&1 | less

쉘 설명서를 확인하십시오 (예 : man bash.)


1
이 오래된 질문에 대한 새로운 독자를위한 의견 (특히 Joachim은 아님) 이것은 모든 사람이 질문을 처음 스캔 할 때 생각하는 것입니다. 그러나 문제는 더 미묘하다 - 후 주석의 설명을 참조 dmckee의 대답
RedGrittyBrick

2> & 1 의 약어 는 | & 입니다. 따라서 다음과 같이 단순화 할 수 있습니다.$ ./somecommad |& less
Melvin Abraham

1

쉘에게 fd 2를 fd 1로 리디렉션하도록 지시하십시오 (stderr를 stdout으로)

 make 2>&1 | less

1

지금까지 모든 답변에서 부족한 한 가지는 이유가 왜 이런 일이 발생하는지입니다. 여기서 문제는 물건을 출력하는 프로세스 stderr와 터미널 less에서 출력을 표시하는 프로세스 간의 경쟁 조건 stdout입니다. 경우 less시작이 표시 모든 출력 stderr터미널에 인쇄 된 다음, less그 보존하고 당신이 종료 한 후에 메시지를 볼 수 있습니다 less. OTOH less가 이미 내용을 표시하기 시작한 경우 오류 메시지가 less의 출력과 섞이고 less종료 후 아무것도 보존 less되지 않습니다 (시작하기 전과 마찬가지로 터미널을 유지하고 그 사이에 발생한 오류 메시지에 대해 아무것도 모르기 때문에).

예를 들어, 쉽게 볼 수 있습니다.

grep foo -r /etc | less

모든 "Permission denied"오류 메시지는 less출력과 혼합되며 종료 후에는 아무것도 나타나지 않습니다. 당신이 할 경우

grep foo -r /etc | (sleep 10; less)

less출력을 표시 할 기회를 갖기 전에 모든 (또는 최소한) 오류 메시지가 모두 터미널로 인쇄되었으므로 나중에 오류 메시지가 표시됩니다.

물론, 시작하기 전에 일반적으로 10 초 동안 대기하고 싶지는 less않지만 Linux를 사용하면 대기 시간에 분수 값을 제공 할 수 sleep 0.1있으며 경쟁 조건을 피하기에 충분할 정도로 작은 프로세스를 자주 실행할 수 있습니다. (물론, 정말로 안전한 측면에 있거나 원한다면 RedGrittyBrick의 솔루션을 사용하십시오).


0

"파일 디스크립터"의 개념을 이해해야합니다. 일반적으로 유닉스 응용 프로그램은 세 가지 특수 파일 설명 자로 시작합니다.

  • 표준 입력
  • 표준 출력
  • 표준 에러

|쉘 의 "파이프" 는 stdout한 프로세스 stdin에서 다음 프로세스와 연결 됩니다 .

의도적으로 오류는 stdin다음 프로세스에 제공되지 않습니다 . 그들은 종종 다음 응용 프로그램에는 의미가 없으며 사용자에게 숨겨져서는 안됩니다.

오류를 stdout에 혼합하려면 예를 들어 2>&1"stderr를 stdout에 추가"라고 하는 eg를 사용할 수 있습니다 . 예를 들어

find /etc 2>&1 | less

액세스 할 수없는 파일의 오류 출력도 포함해야합니다.

find /etc 2>&1 >/dev/null | less

오류 만 줄 것입니다.


0

원하는 행동이 기본값이라고 말하는 한 귀하의 질문에 대해 혼란 스럽습니다.

내가 사용할 때

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

간단한 테스트를 받기 위해

$ ./testredirection | less

당신이 요구하는 것을 수행합니다. 그건 내가 본거야

1
3
5
7
9
(END) 

에서 less

$ ./testredirection | less
0
2
4
6
8
$ 

내가 그만 둘 때 less


이상하지만 항상 이런 것은 아닙니다. 스크립트 ( echo info ; echo error 1>&2)로 시도 하고 테스트를 반복하십시오. 두 줄이 모두 줄어 듭니다.
cYrus

@ cYrus : 저도 예상대로 작동합니다. '코스는 Mac OS 상자에서 시도했습니다. Bash 3.2.17, 394 이하. 아마도 리눅스에 특정한 것일 수 있습니다. 어쨌든 RedGrittyBrick의 접근 방식은 잘 작동합니다.
dmckee --- 전 변조 고양이 새끼

기묘한! Debian Squeeze / Bash 4.1.5 / Less 436
cYrus

예, 직장에서 Scientific Linux 5.3 상자를 열고 bash 3.0.15 이하 382에서 예상되는 동작을 얻었습니다. 회귀가있을 수 있습니까?
dmckee --- 전 운영자 고양이

모르겠다. 버퍼링 문제 일 뿐이다.
cYrus

0

최근 데비안 5.0 중 하나 에서이 문제가 발생합니다. 예를 들어, ls abc | 적은 오류 메시지가 적다는 것을 알았습니다.

몇 번의 시도 끝에 화면 버퍼와 관련된 것으로 나타났습니다. stderr은 실제로 덜 들어 가지 않습니다. 위쪽 또는 아래쪽 화살표 키 (또는 j / k)를 사용하여 시연 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.