STDOUT 및 STDERR로 인쇄(둘 다 동일한 파일로 리디렉션하지 않음)

STDOUT 및 STDERR로 인쇄(둘 다 동일한 파일로 리디렉션하지 않음)

STDOUT 및 STDERR 중 하나를 리디렉션하지 않고 (현재 날짜와 같은) 내용을 인쇄하고 싶습니다.

나는 시도했다:

date 1>&2

하지만 이것은 단지 stdout을 stderr로 리디렉션하는 것 같은데, 이는 내가 원하는 것이 아닙니다. 동일한 파일에 병합하지 않고 둘 다 인쇄하고 싶습니다.

도움이 될 것이라고 확신 tee하지만 어떻게 사용하는지 모르겠습니다.

답변1

원하는 것이 무엇인지 이해한다면 tee다음 명령이 해결책입니다.

your_command 2>&1 | tee /dev/stderr

명령의 출력(즉,errors date)은 표준 출력(사용)으로 리디렉션됩니다 2>&1. 명령을 사용하면 결과가 두 배가 됩니다 tee.

  • 1을 표준 출력으로;
  • 매개변수의 두 번째 파일:/dev/stderr

그런 다음 명령의 결과는 다음 date과 같습니다.

> date 2>&1 | tee /dev/stderr
Sun Dec 11 16:33:35 CET 2022
Sun Dec 11 16:33:35 CET 2022

따라서 >/ >>및 /를 사용하여 원하는 파일로 2>리디렉션 할 수 있습니다.2>>

> date 2>&1 | tee /dev/stderr >file1 2>file2
> cat file1
Sun Dec 11 16:40:59 CET 2022
> cat file2
Sun Dec 11 16:40:59 CET 2022

오류가 발생하면 잘못된 명령을 사용하십시오. 예 datex:

> datex 2>&1 | tee /dev/stderr >file1 2>file2
> cat file1
bash: datex: command not found...
> cat file2
bash: datex: command not found...

답변2

zsh, 이건 그냥

date >&1 >&2

zsh에서 multios이 옵션을 비활성화하지 않는 한 fd가 출력을 위해 여러 번 리디렉션되면 zsh는 이를 파이프로 리디렉션하고 다른 쪽 끝에서 데이터를 읽어 tee유사한 방식으로 대상으로 디스패치합니다.

다른 쉘에서는 다음과 함께 제공할 수 있습니다 perl.

date | perl -ne 'BEGIN{$/=\8192} print; print STDERR'

Cygwin 및 Linux 기반 시스템 이외의 시스템에서는 다음을 수행할 수 있습니다.

date | tee /dev/stderr

이는 Linux/Cygwin에서는 피해야 합니다. 열기는 /dev/stderr/dev/stderr이 가리키는 파일을 다시 열려고 시도하고 결과 파일 설명자에 쓰는 것이 stderr에 쓰는 것과 다릅니다. 그러나 stderr이 파이프나 tty 장치(일반적으로 그렇습니다)에서 열리면 기능적으로 동일해야 합니다.


1 파이프가 포함되어 있다는 점에 유의하세요 cmd >&2 | cmd2. 이는 다소 놀랄 수 있습니다.

관련 정보