Как такие команды, как ls
узнать, что его стандартный вывод?
Кажется ls
, работает по-разному в зависимости от того, что является целевым stdout. Например, если я делаю:
ls /home/matt/tmp
результат:
a.txt b.txt c.txt
Однако если я сделаю
ls /home/matt/tmp | cat
результат (то есть новая строка на результат):
a.txt
b.txt
c.txt
Процесс передается файловый дескриптор 1 для stdout правильно? Как это определяет, как отформатировать результат? Дескриптор файла раскрывает информацию?
command-line
io-redirection
ls
tty
Мэтт Фрёман
источник
источник
Ответы:
В
ls
программе используетisatty()
знать FD 1 , является ли TTY или что - то другое (трубы, файл, и т.д ...). Отman 3 isatty
:Обновление: строка 1538
ls.c
из coreutils (git revision 43a987e1):(
many_per_line
должен быть информативным.)источник
Не точный ответ, а пример. В сценарии Bash вы можете достичь подобного эффекта с
test
/[[
«s-t
:Используя это так:
источник
Из OpenBSD
ls(1)
руководства :Тогда позже:
[...]
источник
Вы можете выполнить
ls
в псевдотерминале, используяscript
команду, перенаправить выводls
в другую команду и получить тот же формат вывода, как если бы не было такого трубопровода потока stdout, т.е. как если бы stdout был терминалом (tty).Для базового
isatty()
механизма уже указывалось Стефаном Хименес см ls.c .источник