ls canalisé est-il le même que ls -1?


19

lsrenvoie la sortie dans plusieurs colonnes, tandis que la ls|catsortie renvoie des octets identiques ls -1pour les répertoires que j'ai essayés. Je vois toujours des ls -1réponses, comme ls -1|wc -l. Y a-t-il jamais une raison de préférer ls -1? Pourquoi ...|catchange la sortie de ls?


1
les noms de fichiers peuvent contenir des sauts de ligne, vous devez donc les compter plusieurs fois ... vous pouvez plutôt les faire posixly: n=0; for i in .* *; do ((n++)) ; done ; echo $n(supprimez le. * si vous ne voulez pas les compter). ou: ls -1d ./.* ./* | grep '^\./' | wc -l (car les noms de fichiers ne peuvent pas contenir '/')
Olivier Dulac

3
lsla sortie vers un terminal inclut généralement des codes couleur par défaut. Pour la sortie vers un non-terminal, la couleur est généralement désactivée par défaut. Dans GNU, c'est --color={always,auto,never}IIRC. Si la couleur est incluse dans l'un mais pas dans l'autre, les sorties peuvent apparaître identiques à l'écran, mais elles ne sont pas identiques en octets (les codes de couleur font partie de la sortie de ls).
un CVn

@ MichaelKjörling Je pense que vous devriez écrire cela comme réponse.
200_success

@ MichaelKjörling C'est quelque chose d'intéressant que je n'ai pas envisagé. Existe-t-il un moyen général de toujours diriger comme si la sortie vers le terminal sans avoir à se rappeler les options du terminal pour la sortie de couleur et de colonne, etc.?
rubystallion

@rubystallion Cela ressemble à une bonne question distincte.
un CVn

Réponses:


26

lsteste si la sortie va vers un terminal. Si la sortie ne va pas vers un terminal, -1c'est la valeur par défaut. (Cela peut être remplacé par l' un des -C, -mou des -xoptions.)

Ainsi, lorsque lsest utilisé dans un pipeline et que vous ne l'avez pas remplacé par une autre option, lssera utilisé -1. Vous pouvez vous y fier car ce comportement est requis par POSIX

Spécifications POSIX

POSIX requiert -1par défaut chaque fois que la sortie ne va pas vers un terminal:

La spécification POSIX :

Le format par défaut consiste à répertorier une entrée par ligne vers la sortie standard; les exceptions concernent les terminaux ou lorsqu'une des options -C, -m ou -x est spécifiée. Si la sortie est vers un terminal, le format est défini par l'implémentation.

Ces trois options qui remplacent le format à colonne unique par défaut sont:

-Créez la
sortie de plusieurs colonnes de texte avec des entrées triées dans les colonnes, selon la séquence de classement. Le nombre de colonnes de texte et les caractères de séparation des colonnes ne sont pas spécifiés, mais doivent être adaptés à la nature du périphérique de sortie. Cette option désactive la sortie au format long.

-m
Format de sortie de flux; liste les noms de chemin sur la page, séparés par un caractère <comma> suivi d'un caractère <espace>. Utilisez un caractère <newline> comme terminateur de liste et après la séquence de séparation lorsqu'il n'y a pas de place sur une ligne pour l'entrée de liste suivante. Cette option désactive la sortie au format long.

-x Identique
à -C, sauf que la sortie multi-texte est produite avec des entrées triées plutôt que vers le bas dans les colonnes. Cette option désactive la sortie au format long.

Documentation GNU

Depuis le manuel GNU ls :

'-1'
'--format = single-column'
Liste un fichier par ligne. Il s'agit de la valeur par défaut pour ls lorsque la sortie standard n'est pas un terminal . Voir également les options -b et -q pour supprimer la sortie directe des caractères de nouvelle ligne dans un nom de fichier. [Italiques ajoutés]

Exemples

Créons trois fichiers:

$ touch file{1..3}

Lorsque la sortie va vers un terminal, GNU lschoisit d'utiliser un format multi-colonnes:

$ ls
file1  file2  file3

Lorsque la sortie est envoyée vers un pipeline, la spécification POSIX requiert que la colonne unique soit la valeur par défaut:

$ ls | cat
file1
file2
file3

Les trois exceptions qui remplacent le comportement par défaut d'une seule colonne sont -mpour les virgules séparées, -Cpour les colonnes triées et -xpour les colonnes triées sur:

$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1  file2  file3
$ ls -x | cat
file1  file2  file3

"POSIX nécessite -1 comme valeur par défaut lorsque la sortie est envoyée à un terminal:" ... mais la citation indique qu'il requiert -1comme valeur par défaut, sauf lorsque la sortie va au terminal (ou dans d'autres conditions)
muru

@muru Merci d'avoir attrapé ça! Réponse mise à jour.
John1024

Eh bien, chaque nuage a une doublure argentée. Parce que votre réponse a été acceptée avant que la mienne ne soit publiée, j'ai un chapeau de pizza génial!
G-Man dit `` Réinstalle Monica ''

@ G-Man Très bien. Et, c'est un beau chapeau!
John1024

9
  • Pourquoi la canalisation de la sortie standard modifie-t-elle le comportement de ls? Parce qu'il a été conçu de cette façon. La spécification POSIX dit:

    Le format par défaut consiste à répertorier une entrée par ligne vers la sortie standard; les exceptions sont aux bornes ou lorsque l' un des -C, -mou des -xoptions est spécifié. Si la sortie est vers un terminal, le format est défini par l'implémentation.

    qui est en fait ambigu au sujet du comportement par défaut (lorsqu'il n'est pas spécifié par une option comme -lou -1) avec une sortie vers un terminal, et la documentation GNU Coreutils dit

    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.

    Ainsi, vous pouvez voir que la sortie vers un fichier agira de la même manière que la sortie vers un tuyau; c'est-à-dire une entrée par ligne, comme si elle -1avait été spécifiée.

  • Pourquoi a-t-il été conçu de cette façon? Il n'est peut-être pas possible de le savoir avec certitude (sauf si quelqu'un peut trouver des notes de conception), mais je suppose:
    • Quand lsécrit sur un terminal, il s'attend à ce qu'un être humain regarde la sortie. Les gens préféreront obtenir des informations dans le nombre minimum de lignes nécessaires, afin que les choses ne défilent pas sur l'écran.
    • Quand lsécrit sur un canal, il s'attend à ce qu'un autre programme lise la sortie. Il est beaucoup plus facile pour un programme de lire des données correspondant à une valeur par ligne que d'essayer d'analyser des colonnes (car les noms de fichiers peuvent contenir des espaces).
  • Y a-t-il une raison de préférer ls -1 lorsque vous écrivez dans un fichier ou un tube? Non.

-4

Lors de la tuyauterie ls, ls ne peut pas déterminer combien de colonnes la console possède réellement (indépendamment de la commande de droite). Donc, c'est ce qu'il fait de son propre choix, ou, en d'autres termes, ce comportement est instable et pourrait changer dans les futures versions.

En revanche, a ls -1été créé dans le but de compter ou de script en général, donc son comportement est stable.


9
Comme les autres réponses disent que ce comportement est requis par POSIX, il est donc incorrect de l'appeler instable.
Henrik - arrêtez de faire du mal à Monica
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.