Jak „mniej” pliku o nazwie „-”?


17

Przypadkowo utworzyłem plik o nazwie -(np seq 10 > -.). Potem próbowałem użyć, lessaby go wyświetlić, ale po prostu się zawiesza.

Rozumiem, że tak się dzieje, ponieważ less -oczekuje danych wejściowych stdin, więc nie interpretuje tego -jako nazwy pliku. Próbowałem, less \-ale to też nie działa.

Czy jest więc jakiś sposób wskazania, lessże -jest to plik, a nie standardowe wejście?

Najlepsze, co mogłem uzyskać, to:

find -name '-' -exec less {} +

2
@muru dziękuję za komentarz, ale możliwy duplikat jest tak konkretny, że nie sądzę, że kwalifikuje się jako „dokładny duplikat”. Jeśli zostałby przeredagowany na coś bardziej ogólnego, na przykład „jak uzyskać dostęp do pliku zaczynającego się od„ - ””, być może.
fedorqui

4
To nie jest duplikat pytania. Sama sprawa -jest inna. -nie jest opcją.
Stéphane Chazelas,

1
@terdon Nie sądzę, że posiadanie tej samej odpowiedzi bezpośrednio oznacza, że ​​są duplikatami. Gdzieś w Meta SO był przykład: jeśli odpowiedź na pytanie brzmi „Nie”, czy cokolwiek, czego poprawna odpowiedź brzmi „Nie”, byłoby duplikatem? Jak powiedziałem wcześniej, interesujące byłoby przeredagowanie kandydata na duplikat, aby był bardziej ogólny; w przeciwnym razie nie ma sensu wysyłać tam innych pytań, takich jak to.
fedorqui

4
@terdon, nie. Zaakceptowane rozwiązanie tam nie zadziała. I nie, -nie jest traktowane jako opcja, jest to zupełnie inny problem niż w przypadku argumentów, które mają kształt opcji.
Stéphane Chazelas,

2
Nie jest konieczne umieszczanie -między pojedynczymi cudzysłowami, takimi jak '-'lub znakami ucieczki, \-ponieważ -nie jest to znak specjalny dla popularnych powłok (przynajmniej tych zgodnych z POSIX). Wynik jest taki sam.
pabouk

Odpowiedzi:


53

Po prostu prefiks ./:

less ./-

Lub użyj przekierowania:

less < -

Pamiętaj, że ponieważ -(w przeciwieństwie do -xlub --foo--na przykład) jest uważana za specjalną nazwę pliku, a nie jako opcję, następujące opcje nie działają:

less -- -   # THIS DOES NOT WORK

3
BTW, to find -name '-' -exec less {} +działa.
Stéphane Chazelas,

6
@fedorqui, nie, to tylko to -i ./-(lub /path/to/-lub ../to/-) to dwie (4) prawidłowe ścieżki do tego -pliku, ale -argument jest szczególny dla less(oznacza odczyt ze standardowego wejścia), ale ./-nie jest specjalny.
Stéphane Chazelas,

2
@fedorqui find -name '-' -exec less {} +to niestandardowy formularz dla find . -name '-' -exec less {} +. Opuszcza drzewo .i znajduje pliki i przekazuje ścieżki tych plików jako argumenty less. Wymień -exec lesssię -exec echo less, aby zobaczyć co jest uruchamiany.
Stéphane Chazelas,

4
@haylem, --oznacza koniec opcji. To nie pomoże tutaj. To -nie jest opcja, to specjalny argument bez opcji. Zobacz także unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

3
@haylem, spróbuj sam. --jest obsługiwany przez getopt () w celu oznaczenia końca opcji, -nie jest rozpoznawany jako opcja przez getopt (), więc -zostanie rozpoznany jako normalny argument, niezależnie od tego, czy --zostanie podany, czy nie. I jako normalny argument, lesspodobnie jak większość narzędzi tekstowych, potraktuje to jako oznaczające stdin, czego tutaj nie chcemy.
Stéphane Chazelas,


3

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


2
+1: Najbardziej przenośne i niezależne od poleceń rozwiązanie, łatwe do zapamiętania i uważane za „najlepszą praktykę”
mveroone

2
@Kwaio jakieś odniesienia do „najlepszych praktyk”? Czuję się z tego ciekawy.
fedorqui

24
Ta odpowiedź dotyczy argumentów, które wyglądają jak opcje. Nie jest tak w przypadku, gdy -nie ma opcji. Korzystanie ./-lub przekierowania, gdy możliwe jest generalnie lepszym rozwiązaniem, gdyż pozwala uniknąć inne rodzaje problemów, takich jak wybrany foo=barz awklub że -. Zobacz także unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756
Stéphane Chazelas

7
Jak mówi Stéphane, to nie odpowiada na pytanie. less -- -nadal będzie próbował czytać ze standardowego wejścia.
Michał Politowski,

5
Możesz usunąć odpowiedź (lub przenieść ją na inne pytanie, ponieważ znajdują się tutaj przydatne odniesienia) lub wyjaśnić, że nie dotyczy ona tego konkretnego przypadku (i może wyjaśnić, dlaczego byłoby to jeszcze bardziej przydatne).
Stéphane Chazelas,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.