2010-08-05 8 views
2

기본적으로 모든 것을 로그 파일에 출력하도록하려는 bash 스크립트를 작성하고 있습니다. 그러나 로그 파일 (예 : tee은 내가 믿는 것) 대신 INSTEAD 요청 (예 : 매개 변수)을 통해 호출 터미널로 출력 할 수도 있습니다. 누구든지이 작업을 수행하는 간단한 방법을 알고 있습니까?스크립트 출력을 요청에 따라 로그 파일이나 OR 터미널에 리디렉션

매개 변수가 사용자 정의 로그 파일이거나 호출 터미널에 대한 참조 일 수 있으면 좋을 것입니다.

나는이의 라인을 따라 생각하고 있어요 : (의사 코드)

#!/bin/bash 

if [ ! $1 ]; then 
    OUT="default.log" 
else 
    OUT=$1 
fi 

#then do this to every call in the script 
commands [param] [param] >> ${OUT} 

나는, 출력에 대한 현재의 터미널을 참조하는 쉬운 방법이 무엇 내가 부탁하고 더 많은 것 같아요? 그래서 ./script.sh, ./script.sh custom.log 또는 script.sh TERMINAL을 할 수 있습니까?

답변

4

/dev/stdout을 파일 이름으로 사용하면 원하는 작업을 수행 할 수 있습니다.

+0

아, 이것이 내가 찾고있는 것입니다. 필자는 bash 스크립팅을 한 이후로 잠시 동안을 보냈습니다. (편집 : 7 분 동안 대답을 수락 할 수 없음) – tj111

+2

'/ dev/stdout'은 Single UNIX Specification, Version 3에 포함되어 있지 않습니다. 더 이식성있는 선택은'/ dev/tty' 일 것입니다. 표준. –

3

I는 다음과 같이 갈 수 있습니다

#!/bin/bash 

if [[ $1 != --stdout ]]; then 
    exec >> "${1:-default.log}" 
fi 

commands [param] [param] 

결과 : 사용자가 --stdout 다음 출력은 표준 출력 간다 통과하면, 그렇지 않으면 로그 파일로 이동합니다. 사용자는 명령 줄에서 로그 파일 이름을 전달할 수 있으며, 로그 파일 이름을 지정하지 않으면 기본값은 default.log입니다.

exec 부분은 스크립트의 모든 향후 출력을 리디렉션하기 때문에 좋습니다. 모든 명령에 >> ${OUT}을 추가하지 않아도됩니다.

+0

이런, 고마워. 배쉬에서 사용하기에 훌륭하지만 발견하기가 너무 많은 깔끔한 작은 것들. – tj111

+0

이것은 훨씬 더 좋지만 exec 줄의 인수에'--stdout'을 추가하지 않아도됩니까? – grddev

+0

@grddev : 아니요. 스크립트에 대한 인수 일뿐입니다. 스크립트가'--stdout'을 넘겨 주면 출력을 리디렉션하지 않음으로써'stdout'으로 갈 것입니다. 그렇지 않다면'exec'는 이름을 제공하지 않으면'named.log' 파일을 보냅니다. –

관련 문제