Shell脚本执行mkdir创建多级目录时生成异常目录结构的原因
问题描述
编写了用于批量创建目录的shell脚本,内容如下:
#!/bin/sh PROJECT_DIR=$(cd "$(dirname "$0")" && pwd) cd ${PROJECT_DIR} || exit 1 mkdir -p Website/{static/{cs,js},templates/{html,xhtml}}
执行./script.sh后生成的目录结构不符合预期,存在异常;但脚本无语法报错,且同一条mkdir命令直接在终端执行时,可以正常生成正确的目录结构。
问题原因
核心原因是脚本首行声明的/bin/sh解释器不支持大括号扩展(brace expansion)语法:
{a,b,c}形式的路径批量展开是Bash、Zsh等shell提供的非POSIX标准扩展特性- 绝大多数Linux发行版中
/bin/sh实际链接的是dash、POSIX sh这类精简shell,这类shell不会解析大括号扩展逻辑,会直接把Website/{static/{cs,js},templates/{html,xhtml}}当成完整的字面目录名创建,最终生成名称带大括号字符的异常目录 - 在终端直接执行命令时,终端默认运行的是支持大括号扩展的Bash,因此命令可以正常执行、生成符合预期的目录结构
修复方案
两种方案二选一即可:
- 将脚本首行的解释器声明修改为
#!/bin/bash,指定用Bash解释执行脚本,保留大括号扩展写法 - 若需要兼容
/bin/sh,去掉大括号扩展写法,拆成显式全路径传给mkdir即可:
mkdir -p Website/static/cs Website/static/js Website/templates/html Website/templates/xhtml
内容的提问来源于stack exchange,提问作者Snow
相关产品推荐
相关产品推荐

