stdin을 stdout 및 stderr로 포크하시겠습니까?

stdin을 stdout 및 stderr로 포크하시겠습니까?

표준 입력을 stdout 및 stderr로 분기할 수 있는지 궁금합니다. 이런 것들,

$ echo "hi" | fork > std.out 2> std.err
$ cat std.out
hi
$ cat std.err
hi

아니면 입력을 서로 다른 두 대상으로 분기할 수 있는 기능이 누락된 것인가요? 이 tee명령은 내가 원하는 것과 비슷해 보이지만 파일에 쓰고 싶지 않습니다. 감사해요.

답변1

저는 Linux의 고전적인 "모든 것이 파일입니다"를 이해해야 했습니다. 이 tee유틸리티는 표준 입력을 표준 출력으로 복사하고 파일로 복사합니다. 따라서 stderr이 기록되는 파일을 식별하면 /dev/stderrstdin을 두 파일 모두에 기록하고 다음과 같이 리디렉션할 수 있습니다.

$ echo "hi" | tee /dev/stderr > test.out 2> test.err
$ cat test.out
hi
$ cat test.err
hi

답변2

zsh에서 출력을 위해 fd를 여러 번 리디렉션하면 zsh는 내부적으로 분기하므로 다음을 수행할 수 있습니다.

echo hi >&1 >&2

stdout 및 stderr로 출력합니다.

test.out그러나 이를 sum 으로 출력하려면 test.err다음과 같이 할 수 있습니다.

echo hi > test.out > test.err

대신에.

Linux 및 Cygwin 기반 시스템 이외의 시스템에서는 다음 명령을 사용하여 동일한 작업을 수행할 수 있습니다.

echo hi | tee /dev/stderr

Linux 및 Cygwin에서는 stderr이 파이프나 tty에서 열리지 않는 한 이는 잘못된 것입니다. 열면 /dev/stderrstderr(fd 2)가 가리키는 파일이 다시 열리므로, 예를 들어 stderr이 로그 파일로 리디렉션되면 이 줄이 포함된 로그 파일을 대체합니다 hi. 소켓이 소켓에 대해 stderr을 열면 실패합니다.열려 있는.

( -a에 대한 옵션을 추가합니다 .tee추가의모드)는 로그 파일 상황에 도움이 될 수 있습니다.

프로세스 교체 지원이 포함된 셸을 사용하는 또 다른 해결 방법은 다음을 사용하는 것입니다.

echo hi | tee >(cat >&2)

그러나 여기에는 자체적인 문제도 있습니다. 예를 들어 일부 셸에서는 bash명령 cat이 기다리지 않으므로 다음과 같은 문제를 볼 수 있습니다.

$ bash -c 'echo hi | tee >(cat >&2); echo after >&2'
hi
after
hi

echo after어디로 달려야 할지 cat에 대해서는 전에 쓴 적이 있습니다 hi.

관련 정보