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
相关产品推荐
相关产品推荐

