Como comandos como ls
sabem qual é o seu stdout?
Parece que ls
está operando diferente, dependendo do que o stdout de destino é. Por exemplo, se eu fizer:
ls /home/matt/tmp
o resultado é:
a.txt b.txt c.txt
No entanto, se eu fizer
ls /home/matt/tmp | cat
o resultado é (ou seja, nova linha por resultado):
a.txt
b.txt
c.txt
O processo recebe um descritor de arquivo 1 para stdout, certo? Como ele determina como formatar o resultado? O descritor de arquivo revela informações?
command-line
io-redirection
ls
tty
Mâtt Frëëman
fonte
fonte
Respostas:
O
ls
programa usaisatty()
para saber se fd 1 é um tty ou algo mais (pipe, arquivo, etc.). Deman 3 isatty
:Updade: Linha 1538 a
ls.c
partir do coreutils (revisão git 43a987e1):(
many_per_line
deve ser auto-descritivo.)fonte
Não é uma resposta exata, mas uma exemplificação. Em um script Bash, você pode obter um efeito semelhante com
test
/[[
's-t
:Usando assim:
fonte
No
ls(1)
manual do OpenBSD :Depois, mais tarde:
[...]
fonte
Você pode executar
ls
em um pseudo-terminal usando oscript
comando, canalizar a saídals
para outro comando e obter o mesmo formato de saída como se não houvesse essa tubulação do fluxo stdout, ou seja, como se stdout fosse um terminal (tty).Para o subjacente
isatty()
mecanismo já apontado por Stéphane Gimenez ver ls.c .fonte