Skip to Content

为 Docker 启用 bash extended glob

相信很多第一次用 Docker 的人都会和我一样,忍不住 docker run --rm ubuntu ls /lib/*/*so,然后对错误提示感到莫名其妙和彻底失望。

后来我写自己的 Ubuntu image 时,觉得这是 Bash option 没启用的原因,于是

# enable wildcard & extended glob: http://mywiki.wooledge.org/glob#extglob
RUN sed -E 's/(# If not running interactively)/shopt -s extglob\n\n\1/' -i /etc/bash.bashrc

今天想完善一下这个 image,回过头来发现是我理解错了。* is interepted by Bash, ls /lib/* would expand * in the host, then ask docker to ls these files。正确地写法应该是 docker run --rm ubuntu bash -c 'ls /lib/*/*so'

同时我还发现了另一件事,/etc/bash.bashrc 对 non interactive shell 无效,我试了各种方法都不能 docker run --rm ubuntu bash -c "ls /usr/lib/x86_+([0-9])-* -d (只有加上 -i 才能 work)。最后我意识到 Docker image 的 non interactive shell 不可能设置 option,因为它完全是从零开始的,而一般我们使用的 terminal 归根结底还是从 tty7 或 ssh 等来的(才能进行各种配置)。