표준 입력을 stdout 및 stderr로 분기할 수 있는지 궁금합니다. 이런 것들,
$ echo "hi" | fork > std.out 2> std.err
$ cat std.out
hi
$ cat std.err
hi
아니면 입력을 서로 다른 두 대상으로 분기할 수 있는 기능이 누락된 것인가요? 이 tee
명령은 내가 원하는 것과 비슷해 보이지만 파일에 쓰고 싶지 않습니다. 감사해요.
답변1
저는 Linux의 고전적인 "모든 것이 파일입니다"를 이해해야 했습니다. 이 tee
유틸리티는 표준 입력을 표준 출력으로 복사하고 파일로 복사합니다. 따라서 stderr이 기록되는 파일을 식별하면 /dev/stderr
stdin을 두 파일 모두에 기록하고 다음과 같이 리디렉션할 수 있습니다.
$ 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/stderr
stderr(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
.