Przypadkowo utworzyłem plik o nazwie -
(np seq 10 > -
.). Potem próbowałem użyć, less
aby 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 {} +
-
jest inna.-
nie jest opcją.-
nie jest traktowane jako opcja, jest to zupełnie inny problem niż w przypadku argumentów, które mają kształt opcji.-
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.Odpowiedzi:
Po prostu prefiks
./
:Lub użyj przekierowania:
Pamiętaj, że ponieważ
-
(w przeciwieństwie do-x
lub--foo--
na przykład) jest uważana za specjalną nazwę pliku, a nie jako opcję, następujące opcje nie działają:źródło
find -name '-' -exec less {} +
działa.-
i./-
(lub/path/to/-
lub../to/-
) to dwie (4) prawidłowe ścieżki do tego-
pliku, ale-
argument jest szczególny dlaless
(oznacza odczyt ze standardowego wejścia), ale./-
nie jest specjalny.find -name '-' -exec less {} +
to niestandardowy formularz dlafind . -name '-' -exec less {} +
. Opuszcza drzewo.
i znajduje pliki i przekazuje ścieżki tych plików jako argumentyless
. Wymień-exec less
się-exec echo less
, aby zobaczyć co jest uruchamiany.--
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--
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,less
podobnie jak większość narzędzi tekstowych, potraktuje to jako oznaczające stdin, czego tutaj nie chcemy.Po prostu
mv - f && less f
. Problem rozwiązany.źródło
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:Przykład
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:
I w Wytycznych dotyczących składni narzędzi (v7):
Polecany przez Bash
Oto fragment instrukcji bash, o jej wbudowanych funkcjach:
Dodatkowe czytanie
źródło
-
nie ma opcji. Korzystanie./-
lub przekierowania, gdy możliwe jest generalnie lepszym rozwiązaniem, gdyż pozwala uniknąć inne rodzaje problemów, takich jak wybranyfoo=bar
zawk
lub że-
. Zobacz także unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
nadal będzie próbował czytać ze standardowego wejścia.