版本:
mysql Ver 14.14使用readline 5.1为osx10.8(i386)分发5.5.43
Grid
368 #
369 # First, try to find BASEDIR and ledir (where mysqld is)
370 # 372 if echo '/usr/local/mysql/share' | grep '^/usr/local/mysql' > /dev/null
373 then
374 relpkgdata=
echo '/usr/local/mysql/share' | sed -e 's,^/usr/local/mysql,,' -e 's,^/,,' -e 's,^,./,'
375 else
376 # pkgdatadir is not relative to prefix
377 relpkgdata='/usr/local/mysql/share'
378 fi
372行的目的是什么?有点奇怪
任何帮助将不胜感激。
答案 0 :(得分:1)
372: if echo '/usr/local/mysql/share' | grep '^/usr/local/mysql' > /dev/null
373: then
grep
如果匹配则返回true,如果不匹配则返回false,因此这将测试字符串/usr/local/mysql/share
是否以(^
)/usr/local/mysql
开头。输出为/dev/null
,因为我们不需要查看它,我们只想比较它。
"那么,"你插话,"这是显而易见的。问题是为什么?"坚持我。
如果匹配:
374: relpkgdata=echo '/usr/local/mysql/share' | sed -e 's,^/usr/local/mysql,,' -e 's,^/,,' -e 's,^,./,'
从/usr/local/mysql/share
开始,剥离开始/usr/local/mysql
,然后剥离开头/
,然后添加./
。
因此/usr/local/mysql/share
变为./share
。
否则,请使用字符串/usr/local/mysql/share
。
375: else
376: # pkgdatadir is not relative to prefix
377: relpkgdata='/usr/local/mysql/share'
"这一切都很好,"我听到你说,"但为什么要经历所有这些旋转(显然)比较和按摩两个固定的文字字符串?我们已经知道了答案,那么所有的测试和替换是什么?"
这是一个公平的问题。
我的第一个怀疑是,我发现存在某种神奇的狂欢,但我不知道,但不,这段代码真的太简单了,不能成为这样的东西。
我的第二个怀疑,因为MySQL 5.0.96(我没有运行,但随时可以参考)显然没有,因为这是一个废弃的尝试,将一些新的魔法行为引入mysqld_safe
从未完成并替换为实际的变量,其测试和按摩比对文字字符串做同样的事情更有意义。
但是,没有。当你拥有的唯一工具是锤子时,一切看起来像钉子。这是什么,是一个简单的事情的例子......艰难的方式。至少这对我来说是什么样的。实际上有一个有点理性的解释。要找到答案,您必须查看源代码(非二进制)分发。
MySQL有很多"硬编码"默认值。事实证明这是一个例子。
在源文件scripts/mysqld_safe.sh
中,上面的代码段看起来非常不同:
if echo '@pkgdatadir@' | grep '^@prefix@' > /dev/null
then
relpkgdata=`echo '@pkgdatadir@' | sed -e 's,^@prefix@,,' -e 's,^/,,' -e 's,^,./,'`
else
# pkgdatadir is not relative to prefix
relpkgdata='@pkgdatadir@'
fi
啊,来源沉思。模式替换。
当您从源代码编译MySQL时,文件scripts/Makefile
包含使用sed
将@prefix@
和@pkgdatadir@
等内容替换为文字值的指令。当然,当Oracle或Linux disto维护者从源代码编译其二进制分发时,也会发生同样的事情。这些路径被硬编码到代码中的许多很多地方,包括这个脚本......导致两个文字字符串的另外难以理解的比较,有人应该已经知道答案。
而不是在构建时测试,一个路径是否是另一个路径的锚定子串,以及" relpkgdata" value应相对于当前目录表示并相应地修改此脚本,该逻辑测试实际上推迟到运行时,比较在构建时替换为其占位符的两个文字。
我已经完成了这么多细节,不是因为它会帮助你排除故障,因为我怀疑它不会。然而,这有点奇怪,值得进一步调查。
如果你在运行MySQL服务器时遇到困难......好吧,你不应该这样做,因为它是一个完善的系统而它应该可以运行。如果您系统上的/bin/sh
未与/bin/bash
进行符号链接,则可能需要将mysqld_safe
的shebang行从#!/bin/sh
更改为#!/bin/bash
但是,除此之外,我怀疑你是通过查看mysqld_safe
来探究错误的兔子洞以找到问题的根源。与mysqld_safe
一样令人费解的是,不能说它没有经过时间测试。正如他们所说,"问题出在其他地方。"
如果可以的话,我建议您熟悉我们可能找到您需要的答案的其他社区,尤其是Ask Ubuntu,Super User, Server Fault和Database Administrators。熟悉每个网站的社区,范围以及每个社区在那里提出问题的人所期望的现有专业水平,并搜索网站以了解您的特定问题&# 39;重新遇到。很可能有人见过它,我们已经修好了其中一个,如果不是这样的话。