6.2.2.6 选项默认值、预期值的选项和 = 号
按照惯例,长格式的选项,如果它们分配了一个值,就应该使用等号(=
)符号,如下所示:
mysql --host=tonfisk --user=jon
对于那些需要一个值的选项(即没有默认值),等号符号是不必要的,因此以下也是有效的:
mysql --host tonfisk --user jon
在这种情况下,mysql 客户端尝试连接到名为 “tonfisk” 的MySQL服务器,使用用户名 “jon”。
由于这种行为,有时会出现问题,当没有为期望一个值的选项提供值时。考虑以下示例,其中用户连接到名为 tonfisk
的MySQL服务器,作为用户 jon
:
$> mysql --host 85.224.35.45 --user jon
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 8.4.0 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| jon@% |
+----------------+
1 row in set (0.00 sec)
省略这些选项中的一个所需值会导致错误,如下所示:
$> mysql --host 85.224.35.45 --user
mysql: option '--user' requires an argument
在这种情况下,mysql 无法找到 --user
选项之后的值,因为在命令行上没有提供任何内容。然而,如果省略为期望一个值但不是最后一个使用的选项的值,你会得到一个不同的错误,这可能不会预期:
$> mysql --host --user jon
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
由于 mysql 假设任何字符串都可以是 --host
命令行上的内容,它会将 --host
和 --user
解释为 --host=--user
,并尝试连接到名为 “--user” 的MySQL服务器。
那些有默认值的选项总是需要在分配一个值时使用等号;如果不这样做,就会出现错误。例如,MySQL服务器 --log-error
选项的默认值是
,其中 host_name
.errhost_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): Unknown MySQL server host '--user' (1)
然而,在选项文件中,不会假定等号。假设 my.cnf
文件的内容如下所示:
[mysql]
user jon
尝试以这种方式启动 mysql 会得到一个不同的错误:
$> mysql
mysql: unknown option '--user jon'
如果你在选项文件中写成 host tonfisk
而不是 host=tonfisk
,将会出现类似的错误。相反,你必须使用等号:
[mysql]
user=jon
现在登录尝试成功了:
$> mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.4.0 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
1 row in set (0.00 sec)
这与在命令行中不需要等号的行为不同:
$> mysql --user jon --host tonfisk
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 8.4.0 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@tonfisk |
+---------------+
1 row in set (0.00 sec)
在选项文件中指定一个需要值但没有提供值的选项会导致服务器因为错误而停止。