记录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 字符,这可能会导致各种问题。
评论区