Почему лейн репл блокирует STDERR - PullRequest
1 голос
/ 28 февраля 2020

Почему lein repl блоки STDERR. Я запускаю lein repl без проекта, а также lein repl или lein run с проектом, и возникают проблемы при печати в STDERR. Например, при подключении к NREPL (другая вкладка терминала) и работе:

(.println System/err "something")

Я не вижу ничего напечатанного в окне запуска терминала - только в repl. Как заставить STDERR печатать в обоих, поскольку это используется для регистрации SYSTEMD. Я использую новейший Leiningen, и проект создается с помощью шаблона app.

1 Ответ

0 голосов
/ 28 февраля 2020

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.

...