Я случайно создал файл с именем -
(например, seq 10 > -
). Затем я попытался использовать less
для просмотра, но он просто зависает.
Я понимаю, что это происходит, потому что less -
ожидает ввода от stdin
, поэтому он не интерпретирует -
как имя файла. Я пытался, less \-
но это тоже не работает.
Итак, есть ли способ указать, less
что -
это файл, а не стандартный ввод?
Лучшее, что я мог получить:
find -name '-' -exec less {} +
-
одиночку другое.-
это не вариант.-
это не рассматривается как опция, это совершенно другая проблема, в случае аргументов, которые имеют форму опций.-
одинарные кавычки одинаковые кавычки'-'
или экранировать их,\-
потому что-
это не специальный символ для общих оболочек (по крайней мере, POSIX-совместимых). Результат тот же.Ответы:
Просто добавьте к нему префикс
./
:Или используйте перенаправление:
Обратите внимание, что поскольку
-
(в отличие от-x
или,--foo--
например) считается специальным именем файла, а не параметром, следующее не работает:источник
find -name '-' -exec less {} +
работает.-
и./-
(или/path/to/-
или../to/-
) два (4) допустимых пути к этому-
файлу, но-
аргумент является специальным дляless
(означает чтение из stdin), но./-
не является специальным.find -name '-' -exec less {} +
- это нестандартная форма дляfind . -name '-' -exec less {} +
. Он спускается по дереву в.
и находит файлы и передает пути этих файлов в качестве аргументовless
. Замените-exec less
на,-exec echo less
чтобы увидеть, что запускается.--
чтобы отметить конец вариантов. Это не поможет здесь. Это-
не опция, это особый аргумент без опции. См. Также unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756--
обрабатывается getopt () для обозначения конца опций,-
не распознается как опция опцией getopt (), поэтому-
будет распознаваться как обычный аргумент, независимо от того--
, предоставлен он или нет. И как обычный аргумент,less
как и большинство текстовых утилит, он будет воспринимать его как значение stdin, чего мы здесь не хотим.Я бы просто
mv - f && less f
. Проблема решена.источник
Примечание: мой ответ НЕ действителен в случае OP, и применяется только к инструментам, следуя соглашению, упомянутому ниже, а не в случае файла, названного точно just
-
(dash), который часто также является особым случаем, чтобы указать, что чтение из стандарта вход ожидается. Смотрите принятый ответ.Оставьте это здесь, поскольку оно содержит полезную информацию для других случаев, на которые можно наткнуться при поиске ответов.
Double-Dash это!
Используйте стандартное
--
соглашение double-dash ( ), чтобы указать последний аргумент:пример
Whhhaattt?
Этот
--
аргумент проистекает из соглашения, поддерживаемого большинством реализаций утилит оболочки и инструментов командной строки, и большинство оболочек явно рекомендуют вам следовать этому при реализации инструментов CLI.Рекомендовано Open Group
OpenGroup также упоминает об этом в разделе описания утилит по умолчанию (v6) своей Базовой спецификации:
А в Руководстве по синтаксису утилит (v7):
Рекомендуется Bash
Вот выдержка из руководства bash о его встроенных функциях:
Дополнительное чтение
источник
-
которого это не вариант. Использование./-
или перенаправление, когда это возможно, обычно является лучшим подходом, поскольку позволяет избежать других видов проблем, таких какfoo=bar
ofawk
или что-
. См. Также unix.stackexchange.com/a/56370 , unix.stackexchange.com/a/110756less -- -
все равно будет пытаться читать со стандартного ввода.