Почему команда «меньше» не может прочитать данные из стандартного ввода?

Да. Несколько.

Функции библиотеки C

Как упоминалось в другом ответе, семейство библиотечных функций exec*p()использует наличие в имени символа косой черты в качестве проверки того, следует ли выполнять поиск пути.

Дополнительная литература

Другие вещи, которые ищут пути

Программы, конечно, могут выполнять свой собственный поиск пути вне библиотеки C. Они могут искать что-то еще, кроме как выполнить их. Или они могут захотеть немного другого поведения, чем библиотечные функции C, у которых есть несколько -известных сюрпризов для тех, кто не знает, что предписывает стандарт POSIX. Поэтому они реализуют свой собственный поисковый код. Обычно они следуют соглашениям библиотеки C, и если имя содержит символ косой черты, они просто используют имя как -.

Например:

Оболочки с механизмами CDPATHили cdpathвыполняют такой поиск и имеют такое поведение. Вот оболочка TENEX C:

~> set cdpath=(/usr /)
~> cd./etc
./etc: No such file or directory.
~> cd etc
/etc
/etc> 

Имена файлов, начинающиеся со знака минус

Один из способов убедиться, что имя файла, начинающееся со знака минус, не воспринимается как опция командной строки -, состоит в добавлении к нему префикса ./. Например:

  • rm./-rf— имя файла, а rm -rf— параметр командной строки -.
  • find./-name wibbleсканирует два дерева каталогов и находит все; тогда как find -name wibbleсканирует одно дерево каталогов и применяет сопоставление с образцом.

Дополнительная литература

Команды, в синтаксисе которых это важно

Иногда синтаксис команды определяется таким образом, что что-то вообще является только именем файла, если оно начинается с точки. В противном случае это что-то другое. В некотором смысле, это обобщение знака минус как условного обозначения опциональных символов.

Например:

ДляmultilogДэна Бернстайна из daemontools,multilogБрюса Гюнтера из daemontools -encore, djbwaresmultilogиs6-logЛорана Берко из s6, аргументы строки команды -представляют собой сценарий регистрации , где первая буква каждого аргумента указывает, что это за команда сценария. Чтобы обозначить каталог журнала, нужно указать аргумент командной строки, начинающийся с косой черты или символа точки. multilog./t./uозначает запись в два каталога; тогда как multilog t./uозначает запись в один каталог и добавление временных меток.

0
26.11.2019, 15:31
2 ответа

Чтобы прочитать из stdin, вы можете использовать

less -

Однако это больше подходит для случаев, когда вы хотите направить вывод другой команды в less. Ввод с клавиатуры также будет работать, но вы будете печатать вслепую и вам придется нажимать Ctrl-C, чтобы вернуть управление меньшему, что делает такое использование довольно трудным (, если не бессмысленным ). Также обратите внимание, что это недокументировано и может вообще не быть переносимым!

Может быть, вы хотите уточнить, почему вы хотите, чтобы lessчитал из stdin?

2
28.01.2020, 02:29

Если вы пытаетесь отправить команды на less, вы можете сделать это, используя +в командной строке, например:

less +G somefile

ls -l | less +G

Это эквивалентно открытию lessи вводу команды Gв приглашении по умолчанию.


Если вы говорите о lessинформации о подкачке, которую вы ввели, вы можете использовать heredoc, но я не уверен, как это использовать:

less << EOF
hello
world
EOF
0
28.01.2020, 02:29

Теги

Похожие вопросы