繁体   English   中英

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

[英]Sed removing instances of log errors from a file, but only if the file doesn't exist?

请注意:这纯粹是一个 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的字符串变量是否不是 null,或者硬编码字符串文字“console”是否不是 null
  2. 如果其中一个为真,则搜索可用的挂载信息( proc/1/mounts )以查看其中是否引用了etc/my.cnf
  3. 如果etc/my.cnf不包含在proc/1/mounts中,则从etc/my.cnf中删除所有log-error实例

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

但我的主要问题是sed

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

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

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

该文件是从模板生成的:

 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"

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

它不可能是。

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

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

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

不。

如果文件不存在?!

不,仅当文件未挂载时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM