Quel est le séparateur magique entre les noms de fichiers dans la sortie ls?


20

La sortie de ls(sans arguments) semble séparer les noms de fichiers avec des sauts de ligne.

Preuve:

  • ls | grep foofonctionne comme prévu, avec le greptraitement 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 lsmet 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?

Réponses:


24

Ou sait-il quand sa sortie est redirigée vers une autre commande et formater sa sortie différemment dans ce cas?

Oui. Du manuel complet (disponible via info lssi la documentation est installée):

Si la sortie standard est un terminal, la sortie est en colonnes (triées verticalement) et les caractères de contrôle sont sortis sous forme de points d'interrogation; sinon, la sortie est répertoriée une par ligne et les caractères de contrôle sont sortis tels quels.

Si vous aimez la sortie d'une colonne, vous pouvez exécuter

ls -1

pour l'obtenir également dans le terminal.


7
Plus précisément, la fonction lsutilise pour déterminer si la sortie est un terminal isatty(3).
Blrfl

Également quelque peu lié, si l'on veut tester cela dans un simple script shell, on peut exécuter tty -set vérifier son état de retour.
Daniel Andersson

10

lsle détecte lorsque vous dirigez sa sortie. Vous pouvez le voir dans la documentation:

Si la sortie standard est un terminal, la sortie est en colonnes (triées verticalement) et les caractères de contrôle sont sortis sous forme de points d'interrogation; sinon, la sortie est répertoriée une par ligne et les caractères de contrôle sont sortis tels quels.

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

ls -1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.