docker运行`输出到bashvariables – 奇怪的行为

我看到一些奇怪的行为,从docker run输出到bashvariables。

简单的例子:

 #!/bin/bash PWD=$(docker run --rm -ti ubuntu pwd 2>&1) # also tried with PWD=`docker run ...` with same behaviour echo $PWD echo abc $PWD echo abc $PWD xyz 

产量

 / abc / xyz/ 

问题是在最后一个echo

你需要修改docker run --rm -ti ubuntu pwd 2>&1 with docker run --rm ubuntu pwd 2>&1可能交互式和tty模式在shellvariables中不能正常工作

Dockers -t选项为进程分配一个伪terminal来输出。 TTY使用CRLF作为结尾,与unix中通常的LF不同。

由于存储在variables中的回车符,示例输出中的“xyz”将覆盖从行首开始的其余文本。

od实用程序可以转储hex或八进制值。

 $ docker run -t busybox pwd | od -b 0000000 057 015 012 0000003 

057 = / 015 = CR 012 = LF

然后正常输出。

 $ docker run busybox pwd | od -b 0000000 057 012 0000002 

删除-t并可能检查错误,而不是将stderrredirect到stdout-i不是必需的,除非进程需要stdin

 PWD=$(docker run --rm ubuntu pwd) [ "$?" == "0" ] || exit 1 echo "[$PWD]" 

输出中出现字符\r\n

 $ docker run --rm -ti ubuntu pwd 2>&1 > /tmp/docker.out $ cat -A /tmp/docker.out /^M$ $ python -c "import sys; print repr(sys.stdin.read())" < /tmp/docker.out '/\r\n' 

另外,不要依赖docker run的输出,因为如果ubuntu image还没有出现,它也会被拉出来,“Pulling image”的消息将成为输出的一部分。