bash - 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 项目,所以很明显他们知道他们在做什么。它看起来像它的说法:
- 检查调用的字符串变量
MYSQL_LOG_CONSOLE
是否不为空,或者硬编码的字符串文字“控制台”是否不为空 - 如果其中一个为真,则搜索可用的挂载信息 (
proc/1/mounts
) 以查看是否etc/my.cnf
在其中引用 - 如果
etc/my.cnf
不包含在 的内部,则从内部proc/1/mounts
删除所有的实例log-error
etc/my.cnf
首先,检查字符串文字“console”是否为空有什么意义[ -n "console" ]
?非空字符串文字怎么可能是……空的?
但我的主要问题是sed
:
sed -i 's/^log-error=/#&/' /etc/my.cnf
我sed
是否正确解释了这个命令?从文件中删除所有实例log-error
...如果文件不存在?!我显然错过了一些东西,只是不确定是什么。提前致谢!
解决方案
用 [ -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=
。
从文件中删除所有日志错误实例...
不。
如果文件不存在?!
不,仅当文件未挂载时。
推荐阅读
- yii2 - Yii2 使用 when 验证器通过第二个模型进行验证
- java - 如何向 SAML/SOAP 请求添加标头
- python - 如果我在 NLTK 中使用 vader,如何提高情绪得分?
- java - Java use byte[] as key in a Map
- mongodb - SailsJS 蓝图 GET 模型无限制
- r - 循环模拟层次聚类 R
- python-3.x - Traceback Error while installing any module in python3
- c# - Use WHERE clause on a subtable in LINQ
- php - 使用 .html 而不是 .php 文件有什么好处吗?
- android - 在 Android 上更新有关通知意图的额外数据?