Uwaga: moja odpowiedź NIE jest prawidłowa w przypadku PO i dotyczy tylko narzędzi zgodnych z konwencją wymienioną poniżej, a nie w przypadku pliku o nazwie właśnie -
(kreska), co często jest również szczególnym przypadkiem, aby określić ten odczyt ze standardu oczekuje się danych wejściowych. Zobacz zaakceptowaną odpowiedź.
Pozostawiając to tutaj, ponieważ zawiera przydatne informacje dla innych przypadków, na które można natknąć się podczas szukania odpowiedzi.
Podwój to!
Użyj standardowej --
konwencji double-dash ( ), aby wskazać ostatni argument:
less -- -FILENAME
Przykład
$ echo "meh" > -badname
$ less -badname
Number is required after -b
$ less -- -badname # GREAT SUCCESS!
Whhhaattt
--
Argument ten wywodzi się z konwencji obsługiwanej przez większość implementacji narzędzi powłoki i narzędzi wiersza poleceń, a większość powłok wyraźnie zaleca, abyś postępował zgodnie z nimi przy wdrażaniu narzędzi CLI.
Zalecane przez Open Group
OpenGroup wspomina o tym również w sekcji Domyślne opisy narzędzia (v6) w swojej Podstawowej specyfikacji:
Domyślne zachowanie: [...] Standardowe narzędzia, które nie akceptują opcji, ale akceptują operandy, rozpoznają „-” jako pierwszy argument, który należy odrzucić.
Wymaganie do rozpoznania „-” wynika z tego, że zgodne aplikacje potrzebują sposobu ochrony swoich argumentów przed wszelkimi dowolnymi opcjami, które implementacja może zapewnić jako rozszerzenie. Na przykład, jeśli standardowe narzędzie foo jest wymienione jako nie przyjmujące żadnych opcji, a aplikacja musi nadać mu ścieżkę z wiodącym łącznikiem, może bezpiecznie to zrobić jako:
foo -- -myfile
i unikaj problemów z -m używanym jako rozszerzenie.
I w Wytycznych dotyczących składni narzędzi (v7):
Wytyczna 10:
Pierwszy argument, który nie jest argumentem opcji, powinien zostać zaakceptowany jako separator wskazujący koniec opcji. Wszelkie poniższe argumenty należy traktować jako operandy, nawet jeśli zaczynają się znakiem „-”.
Polecany przez Bash
Oto fragment instrukcji bash, o jej wbudowanych funkcjach:
O ile nie zaznaczono inaczej, każde wbudowane polecenie udokumentowane w tej sekcji jako akceptujące opcje poprzedzone przez - akceptuje - oznaczające koniec opcji.
Wbudowane:, true, false i test nie akceptują opcji i nie traktują - specjalnie. Wbudowane wyjście, wylogowanie, przerwanie, kontynuacja, pozwolenie i przesunięcie akceptują i przetwarzają argumenty zaczynające się od - bez konieczności -. Inne wbudowane akceptujące argumenty, ale nieokreślone jako akceptujące opcje, interpretują argumenty zaczynające się od - jako niepoprawne opcje i wymagają - aby zapobiec takiej interpretacji.
Zauważ, że echo nie interpretuje - to znaczy koniec opcji.
Dodatkowe czytanie