bash : -x 로그를 파일로 설정


18

set -xverbose / debug 출력을 갖는 쉘 스크립트가 있습니다.

#!/bin/bash

set -x
command1
command2
...

결과는 다음과 같습니다.

+ command1
whatever output from command1
+ command2
whatever output from command2

내 문제는 쉘 출력 (발생이된다 set -x) 명령의 출력 (와 혼합 표준 에러에 간다 command1, command2...). 화면에 "정상"출력 (예 : 스크립트 woud없이 실행 set -x)과 bash의 "추가"출력을 파일에 별도로 사용하게되어 기쁩니다 .

화면에 이것을 표시하고 싶습니다.

whatever output from command1
whatever output from command2

그리고 이것은 로그 파일에 있습니다 :

+ command1
+ command2

(로그 파일에 모든 것이 함께 있으면 괜찮습니다)

set -x 2> file이 설정 명령의 출력 아니기 때문에 분명히 넣은 사람은 아니다 오른쪽을 적용,하지만 배쉬의 동작을 변경합니다.

bash 2> file전체 스크립트를 사용하면 이 셸에서 실행되는 모든 명령의 stderr을 리디렉션하므로 올바른 작업을 수행하지 않으므로 명령의 오류 메시지가 표시되지 않습니다.


2
오늘 아침에 Google-Fu가 강해 보입니다 : 표준 출력을
방해

답변:


20

이 ServerFault 응답을 기반으로 표준 출력을 방해하지 않고 bash -x 출력을 로그 파일로 보내기 , 최신 버전의 bash에는 BASH_XTRACEFD특히 출력의 대체 파일 설명자를 지정하기위한set -x

예를 들어 당신은 할 수 있습니다

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

다음 명령에 대한 표준 표준 출력 및 표준 오류 스트림을 유지하면서 출력 set -x을 파일 로 보냅니다 logfile.

fd 19의 사용은 자의적입니다. 사용 가능한 설명자 (예 : 0, 1, 2 또는 이미 할당 한 다른 숫자)이면됩니다.


실제로 bash 추적 로그를 별도로 저장하지만 완전히 동기화되지 않은 2 개의 출력 (화면의 stdout + stderr 및 로그 파일의 bash 추적)을 읽기가 정말로 어렵습니다. 내가 방금 게시 한 솔루션을 참조하십시오 .
redseven

4

1 년 이상이 지난 후 화면에 "정상"출력 (stdout + stderr-bash 추적)과 파일 (bash.log)에 모두 함께 (stdout + stderr + bash 추적)있는 올바른 솔루션을 찾았습니다. :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

그것은 바로 스틸 드라이버의 대답과 이것 의 조합입니다 .
jarno

3

Steeldriver 하나의 접근 방식을 제공했습니다. 또는 STDERR을 파일로 간단히 리디렉션 할 수 있습니다.

script.sh 2> logfile

그러나 이는 set -x옵션으로 생성 된 출력과 생성 된 다른 오류 메시지가 모두 파일로 이동 함을 의미합니다. 스틸 드라이버의 솔루션 set -x은 아마도 당신이 원하는 결과물 만 리디렉션합니다 .


"... set -x 옵션으로 생성 된 결과물과 생성 된 다른 오류 메시지가 모두 파일로 이동합니다."그래서 이것이 작동하지 않습니다. 내 주된 문제는 "실제 오류"를 쉽게 볼 수 없다는 것입니다.이 모든 bash 출력이 stderr로 이동하기 때문입니다. 명령 오류 메시지를 리디렉션하면 다른 방법으로 "실제 오류"가 표시되지 않습니다.
redseven

@redseven 나는 당신이 요구하는 것이 그다지 명확하지 않다는 것을 두려워합니다. 질문 을 수정 하고 설명해 주시겠습니까? 표준 출력이되지 않는 것에 대해서는 "출력"이라는 용어를 사용하지 마십시오. i) 일반 출력을 분리 하시겠습니까? ii) 명령에 의해 발생 된 오류 및 iii) set -x? 그렇다면 스틸 드라이버의 대답이 충분하지 않습니까? 그렇지 않은 경우 복사하여 사용할 수있는 간단한 스크립트를 알려주십시오.
terdon

@steeldriver는 이미 질문에 완벽하게 답변했습니다.
redseven

@redseven 아, 그럼 시원하게. 귀하의 의견이 훨씬 나중에 왔기 때문에 여전히 무언가가 필요하다고 생각했는데 스틸 드라이버의 답변으로 문제를 해결하지 못했습니다. 다 정렬되어서 다행입니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.