Примечание: мой ответ НЕ действителен в случае OP, и применяется только к инструментам, следуя соглашению, упомянутому ниже, а не в случае файла, названного точно just -
(dash), который часто также является особым случаем, чтобы указать, что чтение из стандарта вход ожидается. Смотрите принятый ответ.
Оставьте это здесь, поскольку оно содержит полезную информацию для других случаев, на которые можно наткнуться при поиске ответов.
Double-Dash это!
Используйте стандартное --
соглашение double-dash ( ), чтобы указать последний аргумент:
less -- -FILENAME
пример
$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!
Whhhaattt?
Этот --
аргумент проистекает из соглашения, поддерживаемого большинством реализаций утилит оболочки и инструментов командной строки, и большинство оболочек явно рекомендуют вам следовать этому при реализации инструментов CLI.
Рекомендовано Open Group
OpenGroup также упоминает об этом в разделе описания утилит по умолчанию (v6) своей Базовой спецификации:
Поведение по умолчанию: [...] Стандартные утилиты, которые не принимают параметры, но принимают операнды, должны распознавать «-» в качестве первого аргумента, который должен быть отброшен.
Требование для распознавания «-» заключается в том, что соответствующим приложениям нужен способ защитить свои операнды от любых произвольных опций, которые реализация может предоставить в качестве расширения. Например, если стандартная утилита foo указана как не имеющая опций, и приложению необходимо указать ей путь с начальным дефисом, она смело может сделать это следующим образом:
foo -- -myfile
и избегайте проблем с использованием -m как расширения.
А в Руководстве по синтаксису утилит (v7):
Рекомендация 10.
Первый аргумент, который не является аргументом опции, должен быть принят в качестве разделителя, указывающего конец опции. Любые последующие аргументы должны рассматриваться как операнды, даже если они начинаются с символа «-».
Рекомендуется Bash
Вот выдержка из руководства bash о его встроенных функциях:
Если не указано иное, каждая встроенная команда, задокументированная в этом разделе как принимающая параметры, предшествует - принимает - для обозначения конца параметров.
Встроенные функции:, true, false и test не принимают параметры и не обрабатывают - специально. Встроенные функции exit, logout, break, continue, let и shift принимают и обрабатывают аргументы, начиная с - без необходимости -. Другие встроенные функции, которые принимают аргументы, но не указаны как принимающие параметры, интерпретируют аргументы, начинающиеся с - как недопустимые параметры и требующие - для предотвращения такой интерпретации.
Обратите внимание, что эхо не интерпретирует - означает конец опций.
Дополнительное чтение