为什么 "sudo -Eualice" 在没有 space 的情况下接受用户参数?

How come "sudo -Eualice" accepts the user argument when there is no space between?

如果我运行以下命令:sudo -Eualice whoami

为什么在标志和参数之间没有 space 时命令接受用户参数?我希望 -Eualice 被解释为 -E -u -a -l -i -c -e.

sudo -Eualice 只是遵循 Unix 命令行的惯例。如果一个选项接受一个选项参数(比如 -u 选项接受一个 username 选项参数)那么选项参数可以与选项字母分开通过空格(如 -u alice)或者它可以紧跟在没有空格的选项字母之后(如 -ualice)。

不带参数的选项也有类似的约定。不带参数的选项(如 -E 在这种情况下)可以后跟空格,或者可以紧跟另一个选项,并且非空格序列可以继续用于多个选项。这就是让您执行 ls -lsatr 之类的操作而不必键入 ls -l -s -a -t -r.

的原因

在您的示例中,您同时使用了这两个跳过空格的变体。 -E 紧跟 u 选项,紧接着是 ualice 选项参数。

没有更多的选项可以跟随没有空格的选项参数,因为那样会产生歧义,所以如果你想添加一个 -P 选项,那么你必须写:

sudo -Eualice -P whoami

或者你可以在 -u 之前的某处写上 -P:

sudo -EPualice whoami

这比必须写更方便:

sudo -E -P -u alice whoami

但是,如果您在其他人可能需要阅读的上下文中编写命令(例如,在其他人将使用和维护的 shell 脚本中),那么您可能会决定使用长的完全空白分隔的版本,因为它更便于人们阅读。