【问题标题】:Optimizing a sed/tr shell script优化 sed/tr shell 脚本
【发布时间】:2012-09-05 22:14:33
【问题描述】:

我编写了一个脚本来自动将 ServerAlias 添加到 Apache 配置文件中,然后重新启动 Apache,对 sedtr 以及一般的 shell 脚本有相当的理解。这是我想出的:

cp /etc/httpd/sites/site.conf tmphost &&
sed s/ServerName\ site.com/ServerName\ site.com^#ServerAlias\ sub.site.com/ \
        tmphost |
    tr '^#' '\n\t' >/etc/httpd/sites/site.conf &&
rm -f tmphost &&
apachectl restart

基本上我正在创建一个副本,将 ServerName 行替换为自身 + 新别名,使用 tr 放入换行符和制表符(sed 对此很奇怪?),覆盖旧的配置文件,删除副本,然后重新启动 Apache。

它有效,但并不能让妈妈感到自豪,如果你明白我的意思的话。关于如何清理它的任何想法?

【问题讨论】:

    标签: apache shell sed tr


    【解决方案1】:

    我喜欢使用 sed 直接添加 ServerAilas 的方式:

    sed -i "0,/^ServerName.\+/s//\0\nServerAlias sub.site.com/" /etc/httpd/sites/site.conf
    apachectl reload
    

    【讨论】:

      【解决方案2】:

      如果你想在 ServerName 行之后添加一个 ServerAlias 行,为什么不使用 'append' 命令添加一行:

      sed '/ServerName site.com/a\
          ServerAlias sub.site.com' tmphost >/etc/httpd/sites/site.conf
      

      在额外行的开头有一个“标签”,您似乎需要它。

      如果你有 GNU sed,你可以使用 -i 选项而不是临时文件进行就地编辑(但如果你正在编辑的文件有多个硬链接,则不要使用 -i 选项,如果它是符号链接,也可能不是;请参阅下面来自 William Pursell 的 cmets。

      请注意,您应该将代码包装在:

      trap "rm -f tmphost; exit 1" 0 1 2 3 13 15
      ...script manipulating tmphost...
      rm -f tmphost
      trap 0
      

      以便在 shell 因信号退出时不会留下临时文件。当然,如果您有就地更改,则根本不需要临时文件。

      【讨论】:

      • 另一方面,如果sed -i 由于某种原因中止临时文件,它会做什么?它会清理临时文件吗?最好避免-i
      • 我刚刚开始使用 sed -i.bak '/ServerName site.com/a \ ServerAlias sub.site.com' /etc/httpd/sites/site.conf。请注意,我必须删除 s 才能使附加工作。
      • 道歉——我会修复答案。
      • @WilliamPursell:有趣的问题,一个我没有调查过的问题。有几个相关的问题:(1)当文件有多个硬链接时它是否正常工作? (2) 当给定的名称是符号链接时,它是否有效?我假设添加 -i 选项的人处理了这两种情况(以及中断信号),但我还没有证明这一点。
      • sed -i 肯定会破坏与 gnu sed 4.1.2 的硬链接,这是我不使用该选项的主要原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2013-04-29
      • 2023-03-16
      相关资源
      最近更新 更多