当我将输出通过管道docker exec
传输到另一个命令时,它似乎弄乱了终端的行尾。
例如:
$ docker exec -it foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
$
但是,如果我随后立即在主机上的同一终端中运行相同的命令:
$ sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
...符合预期
如果将输出通过传递xxd
,则似乎会引入CR字符和LF(0d0a,而不是0a);它也弄乱了来自的输出xxd
:
$ docker exec -i -t foo sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422 {"a":"b","c":"d"
00000010: 7d0d 0a
如果我试图通过释放\r\n
自己来排除docker ,那就很好:
$ printf "{\"a\":\"b\",\"c\":\"d\"}\r\n" | xxd
00000000: 7b22 6122 3a22 6222 2c22 6322 3a22 6422 {"a":"b","c":"d"
00000010: 7d0d 0a }..
$
...这意味着它是docker exec
。
我的主机和容器都在运行Linux。docker info
报告Server Version: 18.03.1-ce
。docker -v
报告Docker version 18.03.1-ce, build 9ee9f40
。
docker exec
(临时)对我的终端做了什么,我该如何解决?
很有意思...
docker run -d ubuntu:latest sleep infinity
$ docker exec -i sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
$ docker exec -it sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
$ docker exec -i -t sharp_einstein sh -c 'echo {\"a\":\"b\",\"c\":\"d\"}' | jq
{
"a": "b",
"c": "d"
}
分离-i
并-t
允许问题出现......(possbly一个错误?)
在手册页中查找docker exec
:
-t, --tty=true|false Allocate a pseudo-TTY. The default is false.
伪TTY(PTY)允许系统与您(人类)进行交互...结果是,泊坞窗在exec
(容器内部)期间分配了一个新的PTY ,以及如何生成换行符,终端的高度和宽度–以及其他负载。
我无法完全解释它,但这不是您想要的东西,它正在馈入管道。
还比较:
$ docker exec -i sharp_einstein sh -c 'stty'
stty: 'standard input': Inappropriate ioctl for device
$ docker exec -i -t sharp_einstein sh -c 'stty'
speed 38400 baud; line = 0;
-brkint -imaxbel
$ stty
speed 38400 baud; line = 0;
-brkint -imaxbel
stty
能够控制PTY对回车和换行符的处理,尽管这些选项对我没有任何影响。从手册页:
* [-]ocrnl translate carriage return to newline * [-]onlcr translate newline to carriage return-newline
对于,也有类似的观察结果sst -t
:例如,使用pty(通过ssh)时进行阶梯式踩踏,并通过管道将其踩到更多
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句