请注意:这纯粹是一个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项目,所以很明显他们知道他们在做什么。它看起来就像在说:
- 检查名为
MYSQL_LOG_CONSOLE
的字符串变量是否不为空,或者硬编码的字符串字面值"console"不为空 - 如果其中一个为真,然后搜索可用的挂载信息(
proc/1/mounts
),看看etc/my.cnf
是否在其中被引用 - 如果
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实例…
号
如果文件不存在?!
不可以,只有当文件没有挂载时才可以。