选项默认值、期望值的选项和等号

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月2日 (日) 16:08的版本 (创建页面,内容为“按照惯例,赋值的长格式选项使用等号(=)符号,如下所示: mysql --host=tonfisk --user=jon 对于需要值的选项(即没有默认值的选项),等号是可选的,因此以下写法也是有效的: mysql --host tonfisk --user jon 在这两种情况下,mysql客户端尝试连接到名为“tonfisk”的主机上运行的MySQL服务器,并使用用户名“jon”的账户。 由于这种行为,有时在期望有值的…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

按照惯例,赋值的长格式选项使用等号(=)符号,如下所示:

mysql --host=tonfisk --user=jon

对于需要值的选项(即没有默认值的选项),等号是可选的,因此以下写法也是有效的:

mysql --host tonfisk --user jon

在这两种情况下,mysql客户端尝试连接到名为“tonfisk”的主机上运行的MySQL服务器,并使用用户名“jon”的账户。

由于这种行为,有时在期望有值的选项中没有提供值可能会导致问题。考虑以下示例,其中用户作为用户jon连接到在主机tonfisk上运行的MySQL服务器:

$> mysql --host 85.224.35.45 --user jon
欢迎使用MySQL监视器。命令以;或\g结尾。
您的MySQL连接ID为3
服务器版本:8.0.33 源码发行版

键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| jon@% |
+----------------+
1行记录(0.00秒)

省略这些选项所需的值将导致错误,如下所示:

$> mysql --host 85.224.35.45 --user
mysql: 选项'--user'需要一个参数 

在这种情况下,mysql无法找到--user选项后面的值,因为命令行上没有跟随它。然而,如果您省略不是最后一个要使用的选项的值,您将获得一个不同的错误,这可能不是您所期望的:

$> mysql --host --user jon
ERROR 2005 (HY000): 未知的MySQL服务器主机'--user'(1)

因为mysql假设在--host后面的任何字符串都是主机名,--host --user被解释为--host=--user,客户端尝试连接到名为“--user”的主机上运行的MySQL服务器。

具有默认值的选项在分配值时始终需要等号;如果未使用等号,将导致错误。例如,MySQL服务器的--log-error选项具有默认值host_name.err,其中host_name是MySQL运行的主机名。假设您在名为“tonfisk”的计算机上运行MySQL,并考虑以下mysqld_safe的调用:

> mysqld_safe & 
[1] 11699 
> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

关闭服务器后,按以下方式重新启动它:

> mysqld_safe --log-error & 
[1] 11699 > 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

结果是相同的,因为--log-error在命令行上没有后续内容,并且它提供了自己的默认值。(&字符告诉操作系统在后台运行MySQL,MySQL本身会忽略它。)现在假设您希望将错误记录到名为my-errors.err的文件中。您可以尝试使用--log-error my-errors启动服务器,但这不会产生预期的效果,如下所示:

> mysqld_safe --log-error my-errors & 
[1] 31357 
> 080111 22:53:31 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080111 22:53:32 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended

[1]+ Done ./mysqld_safe --log-error my-errors

服务器尝试使用/usr/local/mysql/var/tonfisk.err作为错误日志启动,但随后关闭。检查此文件的最后几行显示了原因:

$> tail /usr/local/mysql/var/tonfisk.err
2013-09-24T15:36:22.278034Z 0 [ERROR] Too many arguments (first extra is 'my-errors').
2013-09-24T15:36:22.278059Z 0 [Note] Use --verbose --help to get a list of available options!
2013-09-24T15:36:22.278076Z 0 [ERROR] Aborting
2013-09-24T15:36:22.279704Z 0 [Note] InnoDB: Starting shutdown...
2013-09-24T15:36:23.777471Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2319086
2013-09-24T15:36:23.780134Z 0 [Note] mysqld: Shutdown complete

由于--log-error选项提供了默认值,您必须使用等号来为其分配不同的值,如下所示:

> mysqld_safe --log-error=my-errors & 
[1] 31437 
> 080111 22:54:15 mysqld_safe Logging to '/usr/local/mysql/var/my-errors.err'.
080111 22:54:15 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var

$>

现在服务器已成功启动,并将错误记录到文件/usr/local/mysql/var/my-errors.err中。

在指定选项文件中的选项值时可能会出现类似的问题。例如,考虑一个包含以下内容的my.cnf文件:

[mysql]

host
user

当mysql客户端读取此文件时,这些条目被解析为--host --user或--host=--user,结果如下所示:

$> mysql
ERROR 2005 (HY000): 未知的MySQL服务器主机'--user'(1)

然而,在选项文件中,不假设等号。假设my.cnf文件如下所示:

[mysql]

user jon

在这种情况下,尝试启动mysql会导致不同的错误:

$> mysql
mysql: 未知的选项'--user jon'

如果在选项文件中写入host tonfisk而不是host=tonfisk,将出现类似的错误。而是,您必须使用等号:

[mysql]

user=jon

现在登录尝试成功:

$> mysql
欢迎使用MySQL监视器。命令以;或\g结尾。
您的MySQL连接ID为5
服务器版本:8.0.33 源码发行版

键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。

mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
1行记录(0.00秒)

这与命令行的行为不同,在命令行中,等号是可选的:

$> mysql --user jon --host tonfisk
欢迎使用MySQL监视器。命令以;或\g结尾。
您的MySQL连接ID为6
服务器版本:8.0.33 源码发行版

键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。

mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@tonfisk |
+---------------+
1行记录(0.00秒)

在选项文件中指定需要值的选项而没有值会导致服务器中止并显示错误。