侧边栏壁纸
博主头像
小续的成长时光 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 14 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

记录docker TTY导致的脚本问题

小续
2024-05-13 / 0 评论 / 1 点赞 / 64 阅读 / 0 字 / 正在检测是否收录...

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

1

评论区