首页 > 解决方案 > Sed 从文件中删除日志错误的实例,但前提是该文件不存在?

问题描述

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


查看官方MySQL 8.0 Dockerfile构建时运行的bash 脚本,我看到:

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是否不为空,或者硬编码的字符串文字“控制台”是否不为空
  2. 如果其中一个为真,则搜索可用的挂载信息 ( proc/1/mounts) 以查看是否etc/my.cnf在其中引用
  3. 如果etc/my.cnf不包含在 的内部,则从内部proc/1/mounts删除所有的实例log-erroretc/my.cnf

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

但我的主要问题是sed

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

sed是否正确解释了这个命令?从文件中删除所有实例log-error...如果文件不存在?!我显然错过了一些东西,只是不确定是什么。提前致谢!

标签: bashsed

解决方案


用 [ -n "console" ] 检查字符串文字 "console" 是否为空有什么意义?

该文件是从模板生成的:

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

登录到控制台默认情况下仅在 mysql 8 中启用,从生成脚本

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

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

它不可能是。

我是否正确解释了这个 sed 命令?

不,该sed命令不会删除这些行,它会#在以 . 开头的行之前添加log-error=

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

不。

如果文件不存在?!

不,仅当文件未挂载时。


推荐阅读