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
파이프와 파이프로 리디렉션됩니다 .cat
tee
해당 다중 리디렉션을 취소하려면 다음을 수행하십시오.
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
프로세스가 비동기식으로 실행됩니다 (로 시작하는 것처럼 &
).