Linux Bash Shell 고급 리 셋 작업 - 표준 오류 출력 과 표준 출력 을 깊이 이해 합 니 다.

일반적으로 한 프로그램의 출력 은 표준 출력 과 표준 오류 출력 으로 나 눌 수 있다 는 것 은 이미 널리 알려 져 있다.그러나 화면 에 인쇄 된 출력 은 반드시 표준 출력 입 니까?정 답 은 부정!기본 출력 이 표준 출력 이 아 닙 니 다.
가장 자주 사용 하 는 예 를 들다.nginx - v 또는 ngxin - V 를 통 해 nginx 의 버 전 정 보 를 보고 싶 습 니 다. 맨 뒤의 버 전 번호 만 원한 다 면 awk 나 cut 로 처리 하면 됩 니 다.예 를 들 어 'nginx version: nginx/1.2.7' 중의 '1.2.7' 을 얻 으 려 면 이상 적 인 명령 행 은 'nginx - v | grep nginx | cut - d'/'- f2' 나 'nginx - v | cut - d'/'- f2' 또는 'nginx - v | grep nginx | awk - F'/'{print $2}' 이지 만 실제로는 'nginx version: nginx/1.2.7' 을 출력 합 니 다. 제 가 echo 방법 으로 이 루어 질 수 있다 고 생각 하 시 겠 습 니까?아니 야.예 를 들 어 명령 행 'echo $(nginx - v) | grep nginx | awk - F'/'{print $2}' 또는 'echo $(nginx - v) | grep nginx | cut - d'/'- f2' 도 안 됩 니 다.
    근 데 왜 됐 지?정 답 은 '2 > & 1 |' 또는 '| &' (양자 등가) 를 사용 하여 명령 1 의 표준 오류 출력 을 명령 2 의 표준 으로 입력 하 는 것 이다.
    설명: nginx - v 의 기본 출력 은 표준 오류 출력 입 니 다.예 를 들 어 '출력' (이 때 는 표준 출력 인지 표준 오류 출력 인지 모른다 고 가정) 을 파일 로 재 설정 하고 파일 의 내용 을 볼 수 있 습 니 다.예 를 들 어 'nginx - v > test' 를 실행 할 때 화면 에 'nginx version: nginx/1.2.7' 을 출력 합 니 다. 이것 은 화면 에 표준 오류 출력 이 나타 나 는 것 을 나타 냅 니 다.물론 파일 을 보 는 방식 으로 'cat test' 에서 이 파일 이 있 는 것 을 발견 할 수 있 지만 내용 은 비어 있 습 니 다. 또한 이 명령 이 표준 출력 이 없다 는 것 을 설명 합 니 다.
    열 캡 처 에 대하 여.그러나 열 캡 처 도구 선택 에 있어 서 단일 문 자 를 간격 문자 로 할 수 있다 면 cut 를 사용 하 는 것 이 좋 습 니 다. 테스트 를 통 해 awk 는 표준 오류 출력 을 직접 처리 할 수 없습니다. 표준 오류 출력 을 표준 출력 으로 전환 하 더 라 도 문제 가 있 습 니 다.예 를 들 어 'echo $(nginx - v) | & grep nginx | awk - F'/'{print $2}' 와 'echo $(nginx - v) | grep nginx | awk - F'/'{print $2}', 'echo $(nginx - v) 2 > & 1 | grep nginx | & awk - F'/'{print $2}' 의 결 과 는 똑 같 습 니 다.cut 는 표준 오류 출력 을 처리 할 수 있 습 니 다.그러나 'nginx - v | & grep nginx | awk - F'/'{print $2}' 는 정확 한 결 과 를 출력 할 수 있 습 니 다. '1.2.7'.
    그 밖 에 테스트 과정 에서 grep 도 표준 오류 출력 을 직접 처리 할 수 없 음 을 발견 했다."echo $(nginx - v) 2 > & 1 | grep nginx > test"와 "echo $(nginx - v) | & grep nginx > test"의 결 과 는 모두 test 에 아무런 내용 이 없 으 며 "nginx version: nginx/1.2.7"만 출력 합 니 다."nginx - v | & grep nginx"로 바 꾸 면 됩 니 다.
    tee 도 안 돼!구덩이 가 좀 있 지 않 습 니까?
    참고: Bash Reference Manual 의 3.2.2 Pipelineshttp://www.gnu.org/software/bash/manual/bashref.html#Pipelines
    If ‘|&’ is used, the standard error ofcommand1is connected tocommand2’s standard input through the pipe; it is shorthand for 2>&1 | . This implicit redirection of the standard error is performed after any redirections specified by the command.
    따라서 유사 한 디 버 깅 에 문제 가 생 겼 을 때 표준 오류 출력 인지, 처리 해 야 하 는 지 확인 하 는 것 도 고려 해 야 할 점 이다.

좋은 웹페이지 즐겨찾기