记录docker TTY导致的脚本问题

今天在写脚本时遇到个奇怪的问题,在定义变量TEST时使用了如下命令:

NGINX_VERSION=$(docker run --rm -it nginx:latest bash -c "nginx -v 2>&1" | 2>&1 | awk -F'/' '{ print $2 }')

但在后续使用中出现了以下问题:

 # echo N${NGINX_VERSION}/P
 /P.21.5

我期望的输出为 N1.21.5/P,但实际并不是,于是使用hexdump进行检查:

 # docker run --rm -it nginx:latest bash -c "nginx -v 2>&1" | hexdump -c                             
 0000000   n   g   i   n   x       v   e   r   s   i   o   n   :       n
 0000010   g   i   n   x   /   1   .   2   1   .   5  \r  \n            
 000001d

去掉docker run的 -t 参数(不分配任何 TTY)后,一切看起来很正常:

 docker run --rm -i nginx:latest bash -c "nginx -v 2>&1" | hexdump -c 
 0000000   n   g   i   n   x       v   e   r   s   i   o   n   :       n
 0000010   g   i   n   x   /   1   .   2   1   .   5  \n                
 000001c

对比以上两个输出,可以发现当docker分配 TTY 时,输出中多了一个 \r ,该字符会将光标返回值行首,并使用后面的输出覆盖之前的内容,所以导致了这个问题。

修改后恢复正常:

 # NGINX_VERSION=$(docker run --rm -i nginx:latest bash -c "nginx -v 2>&1" | 2>&1 | awk -F'/' '{ print $2 }') 

 # echo N${NGINX_VERSION}/P                                                                             
 N1.21.5/P

仔细观察,可以看出,在脚本中使用 docker run 命令时,如果我忘记从脚本中省略 -t ,将从 docker run 收集输出命令将包含不可见、不可打印的 \r 字符,这可能会导致各种问题。