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

Shell脚本重定向命令时不丢失sed等特殊字符的问题问询

问题原因

你当前使用的命令存在两个核心问题导致特殊字符丢失:

  1. 单引号嵌套冲突:外层printf用单引号包裹待写入内容,内层sed命令的单引号会提前闭合外层的单引号,后续内容会被shell直接解析而非作为文本写入文件
  2. 特殊字符未转义:\、$等符号在当前的引号上下文下会被当做转义符/变量标识符解析,不会原样保留
最优修复方案

推荐使用带引号的here-doc格式实现内容原样写入,不需要额外转义任何特殊字符,语法更清晰不易出错:

# 原样写入脚本内容
cat > /opt/webhook/sns.sh <<'EOF'
#!/bin/bash
aws sns publish --subject "$(hostname -f)" --message "$(alerts -v | sed 's/\x1b\[[0-9;]*m//g' && echo -e "\n\n" && alerts --components | sed 's/\x1b\[[0-9;]*m//g')"
EOF
# 赋予脚本执行权限
chmod +x /opt/webhook/sns.sh

该方案的核心是<<'EOF'中EOF被单引号包裹,会禁用所有shell展开逻辑,内部的所有字符都会原样写入到目标文件中。

兼容原printf写法的修复方案

如果要保留原printf的写法,需要对嵌套单引号和反斜杠做转义处理:

printf '#!/bin/bash\naws sns publish --subject "$(hostname -f)" --message "$(alerts -v|sed '\''s/\\x1b\\[[0-9;]*m//g'\'' && echo -e "\\n\\n" && alerts --components|sed '\''s/\\x1b\\[[0-9;]*m//g'\'')"\n' > /opt/webhook/sns.sh
chmod +x /opt/webhook/sns.sh

转义规则说明:

  • 内层单引号用'\''格式转义:逻辑为闭合外层单引号→输出字面单引号→重新开启外层单引号
  • 所有反斜杠需要双写为\\,避免被printf当做转义符解析

内容的提问来源于stack exchange,提问作者Catalina Cenan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:02