답변:
참조 man tee
:
이름 : 티-표준 입력에서 읽고 표준 출력 및 파일에 쓰기
시놉시스 : 티 [OPTION] ... [FILE] ...
따라서:
echo test | tee file1 file2 file3
cmd 2>&1 | tee log1 log2
위와 같이 실행을 시도했지만 ctrl-c를 눌러 두 번째 로그 파일로 리디렉션해야합니다. 또한 출력은 콘솔에 인쇄됩니다. 명령 출력을 로그가 아닌 콘솔로 리디렉션하고 싶습니다. 도움을 주시면 감사하겠습니다.
tee
명령은 기록 stdin
파일 (들) 및 위해 도 에 stdout
. 출력이 터미널에 나타나지 /dev/null
않게하려면 평상시처럼 리디렉션 해야합니다.
echo test | tee --append file1 file2
출력이 함수에서 생성되었다고 가정 해 봅시다 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 버전에서 작동해야합니다.
version 4.3.11(1)-release (i686-pc-linux-gnu)
우분투 14.04의 GNU bash ( )에서 이것을 테스트 한 +1 입니다.
@jofel이 답변 아래의 주석에서 언급했듯이 이것은 기본적으로 다음과 zsh
같이 수행 할 수 있습니다 .
echo foobar >file1 >file2 >file3
또는 중괄호 확장을 사용하는 경우 :
echo foobar >file{1..3}
내부적으로 이것은 tee
위에 제공된 답변 과 매우 유사하게 작동합니다 . 쉘은 명령의 stdout을 여러 파일로 파이프하는 프로세스에 연결합니다. 따라서 이러한 방식으로 수행 할 때 기술적 이점이 없습니다 (그러나 실제로 는 좋아 보입니다). 자세한 내용 은 zsh
설명서 를 참조하십시오 .
그러나 다른 표현 방법으로는 언급 할 수 없습니다
echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null
많은 파일을 다룰 때 이것을 단순화 할 수 있습니다.
echo "foobarbaz" | tee file{1..8} > /dev/null
file1
를 원 file8
하고 파일 이름에 대한 예제 자리 표시 자일 것입니다.
zsh
사용할 수 있습니다some_command >output_log_1 >output_log_2
.