如何在Bash脚本中按en_US.utf8排序规则执行目录下的文件
Bash 按指定 locale 排序执行目录文件的实现方案
核心逻辑说明
Bash 通配符的展开排序规则由 LC_COLLATE 环境变量控制,你不需要修改系统全局设置,即可实现仅针对当前操作/当前脚本的排序规则指定,有两种常用的局部生效方案:
方案1:仅针对本次函数调用生效(最局部,无任何全局影响)
在调用命令前临时指定环境变量即可,该赋值仅作用于当前这一条命令的执行上下文,执行完成后自动恢复原有设置:
# 仅本次show_content调用的通配符排序遵循en_US.utf8规则 LC_COLLATE=en_US.UTF-8 show_content /mydir/*
该方案是POSIX标准定义的通用行为,所有兼容POSIX的Shell都支持。
方案2:仅针对当前脚本全局生效
如果要让整个脚本内所有通配符展开都遵循en_US.utf8排序,且不影响脚本外的Shell环境,直接在脚本开头添加如下声明即可:
# 仅在当前脚本的运行环境中生效,不会修改父Shell的配置 export LC_COLLATE=en_US.UTF-8
因为Shell脚本默认在独立的子进程中运行,进程内的环境变量修改不会传递到父进程。
show_content 函数优化
原有函数存在特殊文件名兼容问题,优化版本如下,支持带空格、特殊符号、以-开头的文件名:
show_content() { # 无输入参数时直接返回,避免异常 [ $# -eq 0 ] && return for f in "$@"; do echo "$f" # -- 用于避免文件名以-开头时被cat识别为命令参数 cat -- "$f" done }
可选:locale 有效性校验
如果不确定运行环境是否存在en_US.UTF-8 locale,可提前校验:
if ! locale -a | grep -qi 'en_US\.utf-*8'; then echo "当前环境不存在en_US.UTF-8 locale,无法使用指定排序规则" >&2 exit 1 fi
内容的提问来源于stack exchange,提问作者IsaIkari
相关产品推荐
相关产品推荐

