Например:
xargs -n 1
такой же как
xargs -n1
Но если вы посмотрите на справочную страницу , опция будет указана как -n max-args
, что означает, что пространство должно быть сохранено. В сокращенной форме -n max-args ничего нет .
Это также происходит со многими другими утилитами Linux.
Как это называется в Linux? Все ли утилиты поддерживают сокращенную форму (но никогда не документируют ее на странице руководства)?
Ответы:
Когда вы пишете бит разбора командной строки вашего кода, вы указываете, какие параметры принимают аргументы, а какие нет. Например, в сценарии оболочки, принимающем
-h
параметр (например, для справки) и-a
параметр, который должен принимать аргумент, вы делаетеa:h
Немного говорит : «Я ожидаю , чтобы разобрать два варианта,-a
и-h
, и-a
должен принимать аргумент» (это:
после того,a
что говорит парсер , который-a
принимает аргумент).Следовательно, никогда не возникает двусмысленности в том, где заканчивается опция, где начинается ее значение и где начинается другая.
Запуск это:
Вот почему вы в большинстве случаев не должны писать свой собственный анализатор командной строки для анализа параметров.
В этом примере есть только один сложный случай. Разбор обычно останавливается на первой не-опции, поэтому если у вас есть вещи в командной строке , которая выглядит как варианты:
Следующее решает, что:
--
сигналы конец параметров командной строки, а-world
бит остается для программы , чтобы сделать все , что хочет с (это в одной из позиционных переменных).То есть, кстати, как вы удаляете файл, который имеет тире в начале своего имени файла с
rm
.РЕДАКТИРОВАТЬ :
Утилиты, написанные на C,
getopt()
(объявленные вunistd.h
), работают примерно так же. На самом деле, насколько нам известно,bash
функцияgetopts
может быть реализована с помощью вызова функции библиотеки Cgetopt()
. Perl, Python и другие языки имеют похожие библиотеки синтаксического анализа командной строки, и, скорее всего, они выполняют их анализ аналогичным образом.Некоторые из этих
getopt
иgetopt
подобных библиотечных подпрограмм также обрабатывают «длинные» опции. Им обычно предшествует double-dash (--
), а длинные опции, которые принимают аргументы, часто делают это после знака равенства, например,--block-size=SIZE
опция [некоторых реализаций]du
утилиты (которая также позволяет-B SIZE
указывать одно и то же).Руководства по причинам часто пишутся так, чтобы показать пробел между короткими опциями и их аргументами, вероятно, для удобства чтения.
РЕДАКТИРОВАТЬ : Действительно старые инструменты, такие как
dd
иtar
утилиты, имеют опции без черточек перед ними. Это чисто по историческим причинам и для обеспечения совместимости с программным обеспечением, которое полагается на них для работы именно таким образом.tar
Утилита получила возможность принимать варианты с прочерками в более поздние времена. Руководство BSD дляtar
вызова опций старого стиля для «связанных флагов».источник
getopt()
(объявлено вunistd.h
), что делает то же самое.-a -b
===-ab
-a
есть необязательный аргумент,-ab
это не то же самое, что-a -b
). GNU getopt не останавливает обработку флагов, когда встречает не-флаг: вместо этого (по умолчанию), вместо этого он перемещает флаги в начало argv.xargs
является одной из утилит POSIX. Как прокомментировал @drewbenn, POSIX документирует поведение при разборе опций для большинства своих утилит для сопоставленияgetopt
с некоторыми допусками для других реализаций, говоря в 12.1 Синтаксис аргумента утилиты :и в заключение
В POSIX (помните, что он охватывает только наиболее часто используемые утилиты), есть исключения, которые передают операнды, которые будут опциями в других утилитах, в качестве либо позиционных параметров, либо параметров со специальным синтаксисом :
POSIX допускает необязательные значения параметров:
Не знаю, какие утилиты POSIX используют эту функцию. Ncurses
tic
иinfocmp
утилиты используют функцию для уровней из-v
(информативном / отладке) варианта.Конкретный вопрос, о котором вы спрашивали, подробно описан в оставшейся части этого абзаца и состоит из нескольких строк.
До POSIX некоторые реализации
ps
принимаемых опций без начального дефиса. В описании POSIX это не упоминается в описании утилиты или в обосновании синтаксиса:Помимо POSIX, существуют реализации с длинными опциями (например, GNU getopt_long или X Toolkit ), использующие различные способы разделения или присоединения значения опции к опции. Например, пунктуация может использоваться:
В зависимости от реализации, двойная тире может / не может использоваться, чтобы отличить длинные опции от коротких (getopt): lynx и X Toolkit используют одну черту;
getopt_long
Например, GNU использует двойную черту. Также+
может использоваться, чтобы указать, что опция отменена.В описании POSIX не упоминается ни одно из них, но вы наверняка столкнетесь с ними.
источник
-option=value
должен быть--option=value
(длинный формат-варианта, два тира в начале , а не один)?