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

Synology DSM 6下Shell脚本生成含回车文件名问题求助

文件名带回车符的原因及解决方法

这个问题我在处理Synology脚本时碰到过好几次,核心原因和解决方法都很明确,咱们一步步来拆解:

回车符的来源

最常见的罪魁祸首是脚本文件使用了Windows的换行格式(CRLF):Synology DSM基于Linux系统,默认用LF(换行符)作为行结束标记;但如果你的脚本是在Windows下编辑后传到DSM,或是用Windows风格编辑器编写的,每行结尾会带有\r\n(回车+换行)。shell执行脚本时,会把\r(回车符)当成变量内容的一部分,导致DATE变量的值后面偷偷带上了\r,最终生成的文件名里就出现了那个讨厌的[CR]标记。

另外原脚本的写法也存在不规范的地方:DATE=date +%Y%m%d_%H%M%S /usr/local/mariadb10/bin/mysqldump... 这种同一行里变量赋值直接跟命令的写法,容易因为格式问题引入隐藏的控制字符,虽然shell可能能解析,但风险很高。

解决方法

1. 把脚本转换成Linux换行格式

在DSM的终端里,进入脚本所在目录,执行以下命令去除每行结尾的回车符:

sed -i 's/\r$//' 你的脚本文件名.sh

如果你的DSM没有sed,也可以用vi编辑器打开脚本,输入:set fileformat=unix回车,再输入:wq保存退出。

2. 修正脚本的规范写法

把旧的反引号写法换成$(...)(这是更现代的命令替换写法,能避免很多转义问题),并且把变量赋值和执行命令分成两行(或用分号分隔),让逻辑更清晰:

# 推荐的规范写法
DATE=$(date +%Y%m%d_%H%M%S)
/usr/local/mariadb10/bin/mysqldump -u user -ppwd fm | gzip -c -9 > "/volume1/homes/username/SOS_BU/Syn_MariaDB/fm_${DATE}.gz"

3. 验证变量是否干净

你可以先在终端执行以下命令,检查DATE变量是否还带回车:

DATE=$(date +%Y%m%d_%H%M%S); echo -n "$DATE" | od -c

如果输出里没有\r(回车符),说明变量是正常的,再执行脚本就不会生成带回车的文件名了。


内容的提问来源于stack exchange,提问作者Hans Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:05:51