less
перевіряє, чи stdout
є терміналом, і поводиться так, cat
як ні (копіює stdin до stdout до EOF).
Ця функція дозволяє писати сценарії чи програми, які завжди надсилають свої результати (наприклад, --help
вихідні дані), less
одночасно дозволяючи просте перенаправлення до файлу. Це буде смоктати, якби some_command --fullhelp > help.txt
все-таки чекали, коли пробіл на stdin перегортає текст, або щось таке. Деякі команди (наприклад man
) перевіряють, чи є їх власний вихід, щоб вирішити, надсилати свій вихід через пейджер чи ні. Якщо ви біжите man ls > ls.txt
, він ніколи не викликає ваш $PAGER
.
less
поведінка як котяча корисна, якщо ви забудете відредагувати її з однолінійки, додаючи ще кілька етапів до конвеєра.
less
потрібно розібрати кінцеві розміри (розмір екрана, щоб знати, скільки рядків показувати одразу). Використання, яке ioctl(2)
він використовує stdout
, поверне ENOTTY на нетермінальний, так що не може уникнути обробки ненетермінального випадку. less
насправді використовується isatty(3)
до перевірки термінальних розмірів, але isatty
працює, намагаючись лише tty-ioctl і перевіряє відсутність помилок.
Навіть простий пейджер на зразок more(1)
(принаймні версія util-linux) має цю особливість, оскільки це, мабуть, найпростіша розумна поведінка, яку можна реалізувати для цього випадку.
Зауважте, що коли ви щось вставляєте less
(наприклад grep foo bar.txt | less
), це потрібно відкривати /dev/tty
для введення з клавіатури. (Ви можете бачити, як це можна зробити echo foo | strace less
).
bash script.sh
,bash script.sh | cat
,bash script.sh > file
і подивитися , що висновок , який ви отримаєте.