Comment les commandes comme ls
savent-elles quelle est leur sortie standard?
Il semble ls
fonctionner différemment en fonction de la cible standard. Par exemple, si je le fais:
ls /home/matt/tmp
le résultat est:
a.txt b.txt c.txt
Mais si je le fais
ls /home/matt/tmp | cat
le résultat est (ie nouvelle ligne par résultat):
a.txt
b.txt
c.txt
Le processus est passé un descripteur de fichier 1 pour stdout à droite? Comment détermine-t-il comment formater le résultat? Le descripteur de fichier révèle-t-il des informations?
command-line
io-redirection
ls
tty
Mâtt Frëëman
la source
la source
Réponses:
Le
ls
programme utiliseisatty()
pour savoir si fd 1 est un tty ou autre chose (pipe, fichier, etc…). Deman 3 isatty
:Mise à jour: ligne 1538
ls.c
depuis coreutils (révision git 43a987e1):(
many_per_line
devrait être auto-descriptif.)la source
Pas une réponse exacte mais une exemplification. Dans un script Bash , vous pouvez obtenir un effet similaire avec
test
/[[
« s-t
:L'utiliser comme ceci:
la source
Depuis le
ls(1)
manuel d' OpenBSD :Puis, plus tard:
[...]
la source
Vous pouvez exécuter
ls
dans un pseudo-terminal à l'aide de lascript
commande, diriger la sortie dels
vers une autre commande et obtenir le même format de sortie que s'il n'y avait pas de telle tuyauterie du flux stdout, c'est-à-dire comme si stdout était un terminal (tty).Pour le sous - jacent
isatty()
mécanisme déjà signalé par Stéphane Gimenez voir ls.c .la source