zsh 5x에서 가능한 리디렉션 버그

zsh 5x에서 가능한 리디렉션 버그

다음 명령은 zsh v. 4.x 및 5.x에서 다른 출력을 생성합니다.

{
  (
    printf "X\nY\n"
    printf "WARNING: foo\nWARNING: bar\n" >&2
    printf "1\n2\n"
  ) 2>&1 >&3 | grep -v foo >&2
} 3>&1

(이 코드는 프로그램이 stderr로 보낸 특정 출력을 선택적으로 억제하는 방법을 보여줍니다. 이 경우 경고는 선택적 foo으로 억제되는 동시에 경고 bar통과를 허용합니다. 결국 stderr스트림은 stdout분리된 상태로 유지됩니다.)

v 4.x에서 터미널에 표시되는 출력은 예상대로입니다.

X
Y
1
2
WARNING: bar

WARNING: bar(이 행은 다른 행과 비교하여 다른 순서로 되어 있는 것을 볼 수 있습니다.)

그러나 v 5.0.7(Debian) 및 5.1.1(Darwin)에서 터미널에 표시되는 내용은 다음과 같습니다.

X
Y
1
2
WARNING: bar
X
Y
1
2

IOW, 보내야 할 줄이 stdout두 번 나타납니다.

나는 세 가지 가능성이 있다고 생각합니다.

  1. 이것은 v.5.x의 버그입니다. (이 경우 제 질문은: 해결 방법이 있습니까?)
  2. v.5.x zsh를 올바르게 구성하지 않았습니다(이 경우 내 질문은: 원하는 동작을 얻으려면 v.5.x zsh를 어떻게 구성해야 합니까?).
  3. v. 4.x에는 버그가 있지만 v. 5.x에는 없습니다. 이는 내 코드의 버그를 가리는 것입니다(이 경우 내 질문은: v 5를 얻기 위해 내 코드를 수정하는 방법입니다. x에서 원하는 동작) X? )

답변1

실제로 이 버그는 4.0에서 수정되었습니다.

multios당신이 보는 것은 에 특정한 옵션의 효과입니다 zsh. 다른 쉘에서와 동일한 동작을 보려면 이 옵션을 비활성화 하거나 as를 setopt nomultios호출 해야 합니다 .zshsh

multiosin을 사용하면 표준 출력을 둘 다로 리디렉션 하고 파이프를 둘 다로 리디렉션할 cmd1 >&3 | cmd2수 있습니다 . 바라보다cmd1&3cmd2zsh에서 stderr만 파이프하는 방법은 무엇입니까?자세한 내용은.

관련 정보