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


18

bash에서 :

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

zsh에있는 동안 :

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

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

답변:


22

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프로세스가 비동기식으로 실행됩니다 (로 시작하는 것처럼 &).


3
감사! 그것을 해결하는 또 다른 방법은 (echo hi 2>&1 1>/dev/null) | cat입니다.
Tavian Barnes

1
@TavianBarnes, 좋은 지적, 감사합니다. 완성도를 높이기 위해 답변에 추가했습니다. 그것은 또한 명령 그룹 ( {echo...}|cat) 과 함께 작동합니다
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.