【发布时间】:2019-02-15 12:43:00
【问题描述】:
当 docker 输出通过管道传输到其他命令时,为什么 docker 中的伪 tty 选项会修改输出?
Docker 在使用-t 选项运行时使用CRLF 行尾。所以这是我的 2 个命令,将 CR 添加到另一个命令以使其输出相同。
❯ docker run --rm -ti bash bash -c "echo -n $'\n\n\n'" | od -c
0000000 \r \n \r \n \r \n
❯ docker run --rm bash bash -c "echo -n $'\r\n\r\n\r\n'" | od -c
0000000 \r \n \r \n \r \n
两个命令都通过管道传输到 while read -loop(我希望两个输出相同)
❯ while read -r out; do echo A; done < <(docker run --rm -ti bash bash -c "echo -n $'\n\n\n'")
A
A
A
❯ while read -r out; do echo A; done < <(docker run --rm bash bash -c "echo -n $'\r\n\r\n\r\n'")
A
A
A
为什么会这样?为什么伪 tty 会中断输出?它不应该只告诉docker输入是终端设备吗?
当然,不将-it 用于非交互式脚本是一个有效的解决方案,但不回答“为什么”。
【问题讨论】: