zsh에서 stderr만 파이프하는 방법은 무엇입니까?

zsh에서 stderr만 파이프하는 방법은 무엇입니까?

배쉬에서:

$ echo hi 2>&1 1>/dev/null | cat
$

zsh에서:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

표준 출력을 리디렉션하는 동안 표준 오류만 파이프하는 방법이 있습니까?

답변1

zsh를 사용하고mult_ios옵션다음 위치에서 열기(기본적으로 열기)

echo hi 2>&1 1>/dev/null | cat

1> /dev/null | catstdout의 다중 리디렉션 으로 처리됩니다 .echo

따라서 echostdout은 이제 /dev/null파이프와 파이프 모두로 리디렉션됩니다 cat(를 사용하는 것과 마찬가지로 tee).

여러 리디렉션을 취소하려면 다음을 수행하세요.

echo hi 2>&1 >&- > /dev/null | cat

즉, 리디렉션하기 전에 표준 출력을 닫습니다(파이프 취소)./dev/null

또는 명령 그룹이나 하위 쉘을 사용하십시오. 예를 들면 다음과 같습니다.

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

이렇게 하면 echostdout은 명시적으로만 리디렉션됩니다.한 번(파이프 리디렉션은 그룹/서브쉘에 적용되며 상속됩니다 echo.)

또는 multios완전히 비활성화할 수도 있습니다.

(set +o multios; echo hi 2>&1 > /dev/null | cat)

또는 다음을 사용할 수 있습니다.프로세스 교체파이프 대신:

echo hi 2> >(cat) > /dev/null

그러나 작업 제어가 꺼지면(스크립트에서와 같이) 프로세스가 cat비동기식으로 실행됩니다(마치 시작된 것처럼 &).

관련 정보