Bash脚本输出中单引号被~@~X和~@~Y替换的问题求助
问题:存储系统目录空间统计脚本的stderr输出异常
脚本代码
function GetFilespace() { echo "Group ${1}" # run du -hs on every user in the /data/ directory. Append to a text file du -hs /home/group${1}/data/* >> /home/group1/data/user/stats/filespace_used_individual_${1}.txt echo "Done with group ${1}" } # Loop through the 4 user groups we have for GROUP in group1 group2 group3 backup1 do # Launch GetFilespace function and append stderr output to a text file GetFilespace $GROUP 2>> /home/group1/data/user/stats/permission_denied_${GROUP}.txt & done
问题描述
这个脚本用于统计多组用户的目录空间占用,通过捕获du命令的stderr输出,追踪缺少组读/执行权限的文件。此前stderr文件里的路径单引号显示正常,可直接提取用户名通知用户修复权限;但最近发现stderr中的路径单引号被~@~X开头、~@~Y结尾的字符串替换,导致后续处理权限问题的脚本完全失效。
原因分析
- 核心原因是系统环境发生了变更:要么是新增/更新了终端复用工具(如tmux、screen)、日志采集工具,这类工具会自动转义输出内容;要么是
coreutils包(du属于该包)更新后,默认的路径转义规则发生了变化。 - 另一种可能是shell环境变量
QUOTING_STYLE被设置了特殊值(比如escape),强制du对输出路径做特殊转义处理。
解决方法
1. 直接修改脚本,强制输出原始路径
在du命令中添加--quoting-style=literal参数,让du直接输出未转义的原始路径,避免任何引号替换:
du -hs --quoting-style=literal /home/group${1}/data/* >> /home/group1/data/user/stats/filespace_used_individual_${1}.txt
2. 排查并修复环境问题
- 检查
QUOTING_STYLE变量:执行echo $QUOTING_STYLE,如果输出escape/shell-escape这类值,就在脚本开头添加unset QUOTING_STYLE,取消转义规则。 - 检查
coreutils版本:用dpkg -l | grep coreutils(Debian/Ubuntu)或yum list installed coreutils(RHEL/CentOS)查看版本,若最近刚更新,可回退到之前的版本测试是否恢复正常。 - 检查运行环境:如果脚本通过cron执行,对比cron的环境变量和登录shell的差异(执行
crontab -e添加env > /tmp/cron_env,再和env输出对比),确保没有额外的转义配置生效。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

