【问题标题】:Redirect shell command in a script without loosing special characters在脚本中重定向 shell 命令而不会丢失特殊字符
【发布时间】:2021-08-25 13:28:47
【问题描述】:

从另一个用作包装器的脚本中,我尝试配置将由 webhook 触发的 AWS SNS 警报。问题是我丢失了 SED 命令中的特殊字符,这将帮助我从一些自定义命令(如“警报”)中消除 ASCI 颜色字符:

printf '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')"' > /opt/webhook/sns.sh

基本上我试图在 /opt/webhook/sns.sh 中重定向这个命令以执行。

【问题讨论】:

    标签: bash shell sed printf


    【解决方案1】:

    printf 本身是在解释\x1b,而不是按字面意思写。为了可读性和保护\x1b不被printf解释,我会将两个命令替换移到格式字符串之外。

    printf 'aws sns publish --subject "%s" --message "%s"\n' \
      '$(hostname -f)' \
      "\$(alerts -v | sed 's/\x1b\[[0-9;]*m//g' &&
         printf '\n\n' &&
         alerts --components | sed 's/\x1b\[[0-9;]*m//g')" \
      > /opt/webhook/sns.sh
    

    您会注意到引用很棘手;单引号不能出现在单引号字符串中,因此我使用双引号并显式转义启动命令替换的$

    我实际上根本不会使用printf,而是将cat 与此处的文档一起使用:

    cat <<'EOF' > /opt/webhook/sns.sh
    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
    

    理想情况下,alerts 要么提供一种禁用彩色输出的方法,要么足够聪明地在其标准输出不是终端时自动禁用彩色输出,因此您可以完全省去 sed 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多