Наиболее часто используемая идиома в Unix для отделения флагов командной строки от остальных аргументов - это использование двойного тире (--
).
Если утилита использует функцию библиотеки Си getopt()
(прямо или косвенно), двойное тире будет означать конец опций командной строки, а getopt()
завершит разбор командной строки.
Это из getopt(3)
руководства по OpenBSD:
Интерпретация опций в списке аргументов может быть отменена опцией '--' (двойное тире), которая заставляет getopt() сигнализировать конец обработки аргументов и возвращать -1.
Вот почему правильным способом удаления файла с именем -f
является
$ rm -- -f
например.
Вполне вероятно, что ваша оболочка реализует команду getopts
(которая обычно, но не всегда, является встроенной командой) вызовом этой библиотечной функции.
ИМХО, неплохо знать, как использовать getopts
в сценариях оболочки и getopt()
в программах на Си. Это не очень сложно и значительно облегчает жизнь при написании кода разбора командной строки вашего проекта.
Существует также getopt_long()
, доступный в некоторых библиотеках Си, для разбора "длинных опций" (--option=value
). Однако это расширение (без каламбура).