¿Cómo ls
saben los comandos como cuál es su stdout?
Parece ls
que funciona de manera diferente dependiendo de cuál sea el stdout objetivo. Por ejemplo si lo hago:
ls /home/matt/tmp
el resultado es:
a.txt b.txt c.txt
Sin embargo si lo hago
ls /home/matt/tmp | cat
el resultado es (es decir, nueva línea por resultado):
a.txt
b.txt
c.txt
El proceso se pasa un descriptor de archivo 1 para stdout ¿verdad? ¿Cómo determina cómo formatear el resultado? ¿El descriptor de archivo revela información?
command-line
io-redirection
ls
tty
Mâtt Frëëman
fuente
fuente
Respuestas:
El
ls
programa utilizaisatty()
para saber si fd 1 es un tty o algo más (tubería, archivo, etc.). Deman 3 isatty
:Actualización: Línea 1538
ls.c
desde coreutils (revisión git 43a987e1):(
many_per_line
debe ser autodescriptivo)fuente
No es una respuesta exacta sino una ejemplificación. En un script Bash puedes lograr un efecto similar con
test
/[[
's-t
:Usándolo así:
fuente
Del
ls(1)
manual de OpenBSD :Entonces despúes:
[...]
fuente
Puede ejecutar
ls
en un pseudo-terminal usando elscript
comando, canalizar la salida dels
otro comando y obtener el mismo formato de salida como si no hubiera tal tubería del flujo stdout, es decir, como si stdout fuera un terminal (tty).Para el subyacente
isatty()
mecanismo ya se ha señalado por Stéphane Giménez ver ls.c .fuente