2010-06-29 5 views
21

나는 stderr를 bash로 복제하는 명령의 stdout을 갖고 싶습니다. 예 :stderr을 stderr에 복제하기

$ echo "FooBar" (...) 
FooBar 
FooBar 
$ 

여기서 (...)는 리디렉션 표현식입니다. 그게 가능하니?

+0

참조 작동하고 작동하지 [I 여러 명령에 표준 출력 보낼 수 있습니다 어떻게?] (http://unix.stackexchange.com/questions/28503/할 수있는 - 보낼 - stdout - 여러 명령) –

답변

41

사용 티 :

echo "FooBar" | tee /dev/stderr 

또는 수동으로 복제 할 AWK/펄/Python을 사용

echo "FooBar" | awk '{print;print > "/dev/stderr"}' 

echo "FooBar" | perl -pe "print STDERR, $_;" 
+1

perl 예제 – Znik

+0

에서 STDERR 이후 불필요한 쉼표는 OS 및 셸에서 더 이식 가능합니까? 'tee/dev/stderr' 또는'tee> (cat> & 2)'? –

+0

후자는 모든 배포판에서'/ dev/stderr '을 사용할 수없는 방법으로 보는 더 많은 플랫폼 간 호환이 가능합니다. – Qix

0

stderr로 리디렉션 할 경우 >&2 또는 >/dev/stderr을 사용합니다. 출력을 복제하려면 tee을 사용합니다. 그것의 단점은 임시 파일이 필요하다는 것입니다 :는/dev/표준 에러와

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 
+0

잘못되었습니다. 당신은 큰 흐름을 얻을 수있는 기회를 가지며 보통/root 파일 시스템에 연결되는/tmp 장치를 채 웁니다. – Znik

+0

@Znik -'/ tmp/stdout'은 그 예입니다. 귀하의 상황에 맞는 파일 이름을 자유롭게 바꾸십시오. – mouviciel

9

사용 공정 대체 : http://tldp.org/LDP/abs/html/process-sub.html

echo "FooBar" | tee >(cat >&2)

Tee는 매개 변수로 파일 이름을 사용하고이 파일에 출력을 복제합니다. 프로세스 대체를 사용하면 파일 이름 >(cat) 대신 프로세스를 사용할 수 있으며이 프로세스의 출력을 stderr >(cat >&2)으로 재 지정할 수 있습니다.

+0

이것은/proc 파일 시스템이없는 OS X와 ​​같은 운영 체제에 적합한 솔루션입니다. – Meow

-1
echo "FooBar" |tee /dev/stderr 
tee: /dev/stderr: Permission denied 

레드햇 6.3

echo "FooBar" | (read A ; echo $A ; echo $A >&2) 

+0

죄송합니다. 설명이 추가되었습니다 ;-) – defdefred

관련 문제