] меньше файл1 файл2 | cat - почему это работает?

Вы должны указать закрытый ключ в переключателе -i вместо открытого:

chronos@localhost ~/.ssh $ ssh -vvvi ~/.ssh/id_rsa freebsd@x
21
30.12.2016, 19:48
2 ответа

less выводит текст на стандартный вывод. stdout отправляет

  • на терминал (/ dev / tty?) и открывает средство просмотра буфера по умолчанию
  • через конвейер при передаче его в другую программу с помощью | ( less text | cut -d: -f1 )
  • в файл при перенаправлении с помощью> ( less text> tmp )

Там это функция C под названием "isa tty ", которая проверяет, идет ли вывод на tty (меньше 4.81, main.c, строка 112). Если это так, он использует средство просмотра буфера, в противном случае он ведет себя как cat .

В bash вы можете использовать test (см. man test )

  • -t Дескриптор файла FD FD открывается на терминале
  • -p ФАЙЛ существует и является именованным каналом

Пример :

[[ -t 1 ]] && \
    echo 'STDOUT is attached to TTY'

[[ -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a pipe'

[[ ! -t 1 && ! -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a redirection'
31
27.01.2020, 19:43

less проверяет, является ли его stdout терминалом, и ведет себя как cat , когда это не так (копирует stdin в stdout до EOF).

Эта функция позволяет вам писать сценарии или программы, которые всегда отправляют свой вывод (например, - help output) через less , при этом позволяя легко перенаправлять в файл. Было бы отстойно, если бы some_command --fullhelp> help.txt все еще ждал, пока пробел на стандартном вводе не пролистает текст, или что-то в этом роде. Некоторые команды (например, man ) проверяют свой собственный вывод, чтобы решить, посылать свой вывод через пейджер или нет. Если вы запустите man ls> ls.txt , он никогда не вызовет ваш $ PAGER . Кошачье поведение

less удобно, если вы забыли отредактировать его из однострочника при добавлении дополнительных этапов в конвейер.


less необходимо выяснить размеры терминала (размер экрана, чтобы знать, сколько строк отображать одновременно). ioctl (2) , который он использует в stdout , вернет ENOTTY на нетерминальном устройстве, поэтому в любом случае он не может избежать обработки нетерминального случая. less фактически использует isatty (3) перед проверкой размеров терминала, но isatty работает, пробуя ioctl только для tty и проверяя отсутствие ошибок.

Даже простой пейджер, такой как more (1) (по крайней мере, версия для util-linux), имеет эту функцию, потому что это, вероятно, простейшее разумное поведение для такого случая.


Обратите внимание, что когда вы передаете что-то в less (например, grep foo bar.txt | less ), оно должно открывать / dev / tty для ввода с клавиатуры. (Вы можете увидеть это с помощью echo foo | strace less ).

7
27.01.2020, 19:43

Теги

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