Linux 程序参数带 vs 不带空格

Linux 程序参数带 vs 不带空格

我看到过一些情况,其中参数和特定命令的参数值之间没有空格,例如:

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之间的空格,则不知道您是否试图提供密码或它只是另一个参数。禁止空格可消除任何歧义。-pmysql

因此,如果mysql字符串-pfoo被解释为-p带有参数的foo,大多数程序会将其解释为等同于-p -f -o -o(四个单独的开关,带有-o重复)。

另一个值得注意的例子是sed-i开关,它在带或不带参数的情况下都可以工作。

相关内容