2016-08-05 63 views
0

我看到一些奇怪的行为从docker run获得输出到bash变量。`码头运行'输出到bash变量 - 奇怪的行为

简单的例子:

#!/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 ...

回答

1

您需要修改docker run --rm -ti ubuntu pwd 2>&1docker run --rm ubuntu pwd 2>&1 probabilly互动和TTY模式在shell变量中无法正常工作

+0

宾果!总是那些产生最奇怪行为的小错误。非常感谢!!! – gingerlime

0

\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已不存在,它也将被拉到和的消息“拉图像“将成为输出的一部分。

1

码头工人-t选项分配用于处理以输出到伪终端。 TTY使用CRLF作为结尾,与unix中通常的LF不同。

在你的例子输出中的“XYZ”是覆盖从行开始正文的其余部分由于存储在变量回车。

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

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

057 = /015 = CR012 = LF

然后正常输出。

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

取出-t和可能检查错误,而不是重定向到stderrstdout。除非过程需要stdin,否则不需要-i

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

感谢您的额外信息!真正有用的知道。 – gingerlime