Кажется, что докер-клиент устанавливает stdin и stdout в необработанном режиме, когда включена опция --tty
.Существует вызов setRawTerminal(streams)
в функции setupInput()
, определенной в cli/command/container/hijack.go
, которая устанавливает и стандартный ввод, и стандартный вывод в необработанном режиме ( ссылка на github ).
НасколькоЯ знаю, что этот необработанный режим затем распространяется обратно на терминал, который вы используете.Вы можете заметить это, удалив stty -raw
из следующего примера и выполнив их по порядку.
Короче говоря, режим raw означает, что терминал не должен выполнять какую-либо обработку строки, то есть терминал не действует на CR (\r
).
Простая демонстрация без док-клиента:
❯ while read -r out; do echo A; done < <(bash -c "stty raw; echo -n $'\n\n\n'")
A
A
A
❯ while read -r out; do echo A; done < <(bash -c "stty -raw; echo -n $'\n\n\n'")
A
A
A
или просто:
❯ stty raw; for i in {0..2}; do echo A; done
A
A
A
❯ stty -raw; for i in {0..2}; do echo A; done
A
A
A