출력을 여러 로그 파일로 리디렉션하는 방법


52

표준 출력을 여러 로그 파일로 리디렉션하는 방법은 무엇입니까? 다음은 작동하지 않습니다.

some_command 1> output_log_1 output_log_2 2>&1

6
zsh사용할 수 있습니다 some_command >output_log_1 >output_log_2.
jofel

답변:


70

참조 man tee:

이름 : 티-표준 입력에서 읽고 표준 출력 및 파일에 쓰기

시놉시스 : 티 [OPTION] ... [FILE] ...

따라서:

echo test | tee file1 file2 file3

stderr을 둘 이상의 파일로 리디렉션 할 수 있습니까?
fromnaboo 2016 년

예, 리디렉션 덕분에 수행 할 수 있습니다. find / -name test 2> & 1 | tee file1 file2 file3
akond

@ akond, cmd 2>&1 | tee log1 log2 위와 같이 실행을 시도했지만 ctrl-c를 눌러 두 번째 로그 파일로 리디렉션해야합니다. 또한 출력은 콘솔에 인쇄됩니다. 명령 출력을 로그가 아닌 콘솔로 리디렉션하고 싶습니다. 도움을 주시면 감사하겠습니다.
doubledecker

@doubledecker tee명령은 기록 stdin파일 (들) 및 위해 stdout. 출력이 터미널에 나타나지 /dev/null않게하려면 평상시처럼 리디렉션 해야합니다.
Minix

4
여러 파일을 추가 할 수도 있습니다.echo test | tee --append file1 file2
user1364368

13

출력이 함수에서 생성되었다고 가정 해 봅시다 cmd().

cmd() {
    echo hello world!
}

cmd콘솔이 아닌 두 파일로 출력을 경로 재 지정하려면 다음을 사용할 수 있습니다.

cmd | tee file1 file2 >/dev/null

이것은 티로의 데이터 소스 파이핑이 주어지면 여러 파일에서 작동합니다.

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

이것은 또한 작동합니다 :

echo $(cmd) | tee file1 file2 >/dev/null

/dev/null리디렉션이 없으면 tee는 지정된 파일 외에도 stdout 으로 출력을 보냅니다 .

예를 들어 콘솔에서 실행하면 출력이 표시됩니다. crontab에서 실행하면 결과가 우편으로 발송되는 상태 메시지가 나타납니다 ( https://unix.stackexchange.com/a/100833/3998 참조 ).

이것은 Ubuntu 12.04의 bash에서 나에게 도움이되었으며 GNU bash 4.3.11 (1)을 사용하여 Ubuntu 14.04에서 확인되었으므로 모든 최신 GNU bash 버전에서 작동해야합니다.


@doubledecker-이것은 귀하의 조건을 만족하는 것처럼 보이므로 답변으로 받아 들여질 수 있습니다. 또한 version 4.3.11(1)-release (i686-pc-linux-gnu)우분투 14.04의 GNU bash ( )에서 이것을 테스트 한 +1 입니다.
belacqua 2016 년

9

오래된 게시물이지만 방금 발견했습니다 ...

출력을 리디렉션하는 대신 > /dev/null마지막 파일로 리디렉션 할 수 있습니다.

echo "foobarbaz" | tee file1 > file2

또는 출력을 추가하는 경우 :

echo "foobarbaz" | tee -a file1 >> file2

이것은 다른 답변이 말한 것입니다 -a (티를 제외하고 )
Archemar

이것은 갈 길입니다.
71GA

5

@jofel이 답변 아래의 주석에서 언급했듯이 이것은 기본적으로 다음과 zsh같이 수행 할 수 있습니다 .

echo foobar >file1 >file2 >file3

또는 중괄호 확장을 사용하는 경우 :

echo foobar >file{1..3}

내부적으로 이것은 tee위에 제공된 답변 과 매우 유사하게 작동합니다 . 쉘은 명령의 stdout을 여러 파일로 파이프하는 프로세스에 연결합니다. 따라서 이러한 방식으로 수행 할 때 기술적 이점이 없습니다 (그러나 실제로 좋아 보입니다). 자세한 내용 zsh설명서 를 참조하십시오 .


2

그러나 다른 표현 방법으로는 언급 할 수 없습니다

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

많은 파일을 다룰 때 이것을 단순화 할 수 있습니다.

echo "foobarbaz" | tee file{1..8} > /dev/null

2
이것은 이미 주어진 다른 답변과 어떻게 다릅니 까? 특히 소수의 사람들 은 자신의 이름으로 문자 그대로 문자 file1를 원 file8하고 파일 이름에 대한 예제 자리 표시 자일 것입니다.
Eric Renouf

1
가능성이 있든 없든 이것은 정확히 내가 필요한 솔루션이며 다른 사람을 도울 수 있다고 생각했습니다.
user149146
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.