La sortie de ls
(sans arguments) semble séparer les noms de fichiers avec des sauts de ligne.
Preuve:
ls | grep foo
fonctionne comme prévu, avec legrep
traitement de chaque nom de fichier comme une ligne d'entrée distincte.ls > files.txt; vim files.txt
-> dans Vim, chaque fichier est sur une ligne distincte
Et pourtant, dans le terminal, la sortie de ls
met plusieurs fichiers sur une seule ligne, en séparant les noms de fichiers avec des espaces pour créer des colonnes bien alignées:
$ ls
a.txt b.txt c.txt
Donc ma question est, comment ça marche?
Utilise-t-il un caractère de contrôle spécial pour «simuler» une nouvelle ligne? Ou sait-il quand sa sortie est redirigée vers une autre commande et formater sa sortie différemment dans ce cas?
ls
utilise pour déterminer si la sortie est un terminalisatty(3)
.tty -s
et vérifier son état de retour.ls
le détecte lorsque vous dirigez sa sortie. Vous pouvez le voir dans la documentation:Si vous souhaitez que chaque fichier de la sortie soit placé sur une ligne distincte quelle que soit la redirection du canal, vous pouvez utiliser
la source