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的字符串变量是否不为空,或者硬编码的字符串字面值"console"不为空
  2. 如果其中一个为真,然后搜索可用的挂载信息(proc/1/mounts),看看etc/my.cnf是否在其中被引用
  3. 如果etc/my.cnf不包含在proc/1/mounts中,则从etc/my.cnf中删除log-error的所有实例

首先,检查字符串字面值"console"是null还是不与[ -n "console" ]?一个非空字符串字面值怎么可能是…null?

但是我的主要问题是sed:

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

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

检查字符串literal "console"[-n "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"

一个非空字符串字面值怎么可能是…null?

不可能。

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

sed命令不删除行,它在以log-error=开头的行前面加上#

从文件中删除所有log-error实例…

如果文件不存在?!

不可以,只有当文件没有挂载时才可以。

相关内容

最新更新