代码之家  ›  专栏  ›  技术社区  ›  hotmeatballsoup

Sed从文件中删除日志错误实例,但前提是文件不存在?

  •  0
  • hotmeatballsoup  · 技术社区  · 4 年前

    请注意: 这纯粹是bash脚本 sed 这个问题,尽管它顺便提到了一些其他技术(MySQL、Docker等),作为上下文。


    看着a bash script 当官方 MySQL 8.0 Dockerfile 构建,我看到这个:

    if [ -n "$MYSQL_LOG_CONSOLE" ] || [ -n "console" ]; then
      # Don't touch bind-mounted config files
      if ! cat /proc/1/mounts | grep "etc/my.cnf"; then
        sed -i 's/^log-error=/#&/' /etc/my.cnf
      fi
    fi
    

    …我试图弄清楚它的作用。有些事情对我来说没有意义,但这是来自MySQL Docker官方项目的,所以很明显他们知道自己在做什么。它 就像它说的:

    1. 检查是否调用了字符串变量 MYSQL_LOG_CONSOLE 不为null,或者如果硬编码字符串文字“console”不为null
    2. 如果其中之一为真,则搜索可用的装载信息( proc/1/mounts )看看是否 etc/my.cnf 其中引用了
    3. 如果 etc/my.cnf 不包含在 proc/1/挂载 ,然后删除的所有实例 log-error 从内部 etc/my.cnf

    首先,使用以下命令检查字符串文字“console”是否为null有什么意义 [ -n "console" ] ? 非空字符串文字怎么可能是…null?

    但我的主要问题是 sed :

    sed -i 's/^log-error=/#&/' /etc/my.cnf
    

    我在解释这个吗 sed 命令正确吗? 删除的所有实例 日志错误 从文件中。。。如果文件不存在?!我显然遗漏了什么,只是不确定是什么。提前感谢!

    0 回复  |  直到 4 年前
        1
  •  1
  •   KamilCuk    4 年前

    使用[-n“console”]检查字符串文字“console)是否为null有什么意义?

    该文件由生成 template :

    if [ -n "$MYSQL_LOG_CONSOLE" ] || [ -n "%%DEFAULT_LOG%%" ]; then
    

    默认情况下,仅在mysql 8中启用了控制台日志记录,从 generating script :

    declare -A DEFAULT_LOG
    DEFAULT_LOG["5.6"]=""
    DEFAULT_LOG["5.7"]=""
    DEFAULT_LOG["8.0"]="console"
    

    非空字符串文字怎么可能是…null?

    这不可能。

    我正确地解释了这个sed命令吗?

    不是的 sed 命令不会删除行,它会添加前缀 # 在开始的队伍前面 log-error= .

    从文件中删除所有日志错误实例。。。

    不。

    如果文件不存在?!

    否,仅当文件未被挂载时。