You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:33:26