lein repl
такого не делает. Вы можете проверить это сами:
# stop our individual writes from overlapping
with_lock() { exec {lock_fd}>>./tty_write_lock; flock "$lock_fd"; "$@"; exec {lock_fd}>&-; }
lein repl 3>&2 \
> >(while IFS= read -r line; do with_lock printf 'O:<%q>\n' "$line" >&3; done) \
2> >(while IFS= read -r line; do with_lock printf 'E:[%q]\n' "$line" >&3; done) \
3>&- <<'EOF'
(.println System/err "something on stderr")
(.println System/out "something on stdout")
EOF
... который содержит, помимо прочего, вывод:
O:<$'user=> (.println System/err "something on stderr")\E[50G\E[8G\E[51G'>
E:[something\ on\ stderr]
O:<nil>
O:<$'user=> (.println System/out "something on stdout")\E[50G\E[8G\E[51G'>
O:<something\ on\ stdout>
O:<nil>
Как видите, something on stdout
находится внутри O:<...>
, как создано обработкой замены процесса stdout; тогда как something on stderr
находится внутри E:[...]
, как это было создано обработчиком процесса подстановки процесса.
Чтобы взглянуть на это по-другому:
{ strace -f -e write lein repl 2>&1 | egrep 'write[(][12],'; } <<'EOF'
(.println System/err "something on stderr")
(.println System/out "something on stdout")
EOF
... включает в себя среди выдает следующие системные вызовы:
[pid 10467] write(2, "something on stderr", 19) = 19
[pid 10467] write(1, "something on stdout", 19) = 19
... как вы можете видеть, stderr правильно записан в FD 2, тогда как stdout правильно записан в FD 1.