Почему «sudo -Eualice» принимает аргумент пользователя, если между ними нет пробела? - PullRequest
0 голосов
/ 28 января 2020

Если я запускаю следующую команду: sudo -Eualice whoami

Почему команда принимает пользовательский аргумент, если между флагом и аргументом нет пробела? Я ожидаю, что -Eualice будет интерпретироваться как -E -u -a -l -i -c -e.

1 Ответ

1 голос
/ 29 января 2020

sudo -Eualice просто следует обычному соглашению для Unix командных строк. Если опция принимает аргумент опции (как опция -u принимает аргумент опции username), тогда аргумент опции может быть отделен от буквы опции пробелом (как в -u alice ) или он может сразу следовать за буквой параметра без пробела (как в -ualice).

Существует аналогичное соглашение для параметров, которые не принимают аргументы. За параметром, который не принимает аргументы (например, -E в этом случае), может следовать пробел или сразу же может следовать другой параметр, и эта последовательность без пробелов может продолжаться для нескольких опций. Это то, что позволяет вам делать такие вещи, как ls -lsatr, вместо того, чтобы вводить ls -l -s -a -t -r.

В вашем примере у вас есть оба варианта пропуска пробелов в действии одновременно. За -E сразу же следует опция u, за которой сразу же следует u 'alice параметр-аргумент.

Никакие дальнейшие параметры не могут следовать за параметром-аргументом без пробела, поскольку это быть двусмысленным, поэтому, если вы хотите добавить опцию -P, вам нужно будет написать:

sudo -Eualice -P whoami

или вы можете написать -P где-то перед -u:

sudo -EPualice whoami

, что удобнее, чем писать:

sudo -E -P -u alice whoami

Однако, если вы писали команду в контексте, где ее могли бы прочитать другие люди (скажем, в оболочке) сценария, который другие люди будут использовать и поддерживать), тогда вы можете решить использовать длинную версию, полностью разделенную пробелами, потому что для людей она более понятна для чтения.

...