zsh에서 stderr 만 파이프하는 방법은 무엇입니까? : $ echo hi 2>&1

bash에서 :

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

zsh에있는 동안 :

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

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



답변

zsh 및 mult_ios옵션이 켜져있는 경우 (기본적으로 설정되어 있음)

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

1> /dev/null | cat의 여러 리디렉션으로 볼 echo의 표준 출력.

따라서 echo의 stdout은 이제을 사용하는 것처럼 /dev/null파이프와 파이프로 리디렉션됩니다 .cattee

해당 다중 리디렉션을 취소하려면 다음을 수행하십시오.

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

즉, 다음으로 리디렉션하기 전에 stdout을 닫고 (배관 취소) /dev/null

또는 다음과 같은 명령 그룹 또는 서브 쉘을 사용하십시오.

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

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

또는 multios모두 비활성화 할 수 있습니다 :

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

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

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

그러나 작업 제어가 꺼져 있으면 (스크립트 에서처럼) cat프로세스가 비동기식으로 실행됩니다 (로 시작하는 것처럼 &).


답변