我看到过一些情况,其中参数和特定命令的参数值之间没有空格,例如:
mysql -u [user] -p[pass] mydb < mydb.sq
注意:-p 和 [pass] 之间没有空格
来源:https://stackoverflow.com/a/5110023/6348859
为什么在这种情况下不需要空格?在指定值之前,是否总是可以使用任何命令省略空格,或者在某些情况下是否甚至需要空格,以及由什么决定?
谢谢。
答案1
“mysql”工具使用常见的获取opt_long()函数来解析其命令行参数(或至少足够紧密地模拟其行为)。
在 getopt() 和 getopt_long() 中,空格不是必需的 - 如果选项定义为带有参数,则始终可以将值放在选项旁边。(不过,请记住,并非所有程序都使用 getopt!)
但是,区别在于参数是必需的还是可选的:
-u
定义为采取必需参数,因此和都是-u Fred
可以-uFred
接受的,对于长选项来说也是如此,要么--user Fred
或,--user=Fred
要么都可以。
-p
定义为采取可选参数,所以-pFoobar
总是可以接受的,但-p Foobar
可能会产生歧义(下一个词可能是选项参数,也可能是位置参数);在这种情况下,解析器将假定指定了选项没有任何論點。
(将 -p 定义为采用可选参数而不是像 -u 那样要求其为必需参数的原因是,命令行参数可能对其他用户可见,甚至存储在系统日志中,因此该工具宁愿通过交互式提示读取密码。)
作为 getopt() 的一个扩展示例,在一个程序中-abcdef
可以解析为六个没有参数的选项,但在另一个程序中它可以解析为没有参数的选项 -a -b,然后是带有参数“def”的选项 -c,而在另一个程序中它可以解析为带有参数“bcdef”的选项 -a。
为什么在这种情况下不需要空格?在指定值之前,是否总是可以使用任何命令省略空格,或者在某些情况下是否甚至需要空格,以及由什么决定?
你搞错了:在另一种情况下,空间也不需要。相反,在这种情况下,空间一定不当 -u 允许时,-p 会出现。
这不适用于全部但是,命令。并非所有 C 程序都使用 getopt_long(),大多数非 C 程序根本不使用它(例如,Python 的 ArgumentParser 当然是用 Python 编写的,尽管它的行为仍然几乎像 getopt_long)。
有些是大多getopt 类似,但又有足够多的差异,让人觉得很烦(例如,curl 不接受长选项后的 '=',它总是需要一个空格),而且有很多根本不遵循 getopt 样式。(例如,许多使用其标准参数解析包的 Golang 程序使用“MIT/X11”选项样式。)
答案2
这完全是程序特定的。mysql
的-p
行为相当不寻常,但却是合理的,而且并非闻所未闻。
如果是mysql
,-p
单独的 会触发略有不同的行为:程序将以交互方式询问密码,而不是使用提供的密码作为 的参数。如果允许 和 密码-p
之间的空格,则不知道您是否试图提供密码或它只是另一个参数。禁止空格可消除任何歧义。-p
mysql
因此,如果mysql
字符串-pfoo
被解释为-p
带有参数的foo
,大多数程序会将其解释为等同于-p -f -o -o
(四个单独的开关,带有-o
重复)。
另一个值得注意的例子是sed
的-i
开关,它在带或不带参数的情况下都可以工作。