ls
renvoie la sortie dans plusieurs colonnes, tandis que la ls|cat
sortie renvoie des octets identiques ls -1
pour les répertoires que j'ai essayés. Je vois toujours des ls -1
réponses, comme ls -1|wc -l
. Y a-t-il jamais une raison de préférer ls -1
? Pourquoi ...|cat
change la sortie de ls
?
19
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 '/')ls
la 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).Réponses:
ls
teste si la sortie va vers un terminal. Si la sortie ne va pas vers un terminal,-1
c'est la valeur par défaut. (Cela peut être remplacé par l' un des-C
,-m
ou des-x
options.)Ainsi, lorsque
ls
est utilisé dans un pipeline et que vous ne l'avez pas remplacé par une autre option,ls
sera utilisé-1
. Vous pouvez vous y fier car ce comportement est requis par POSIXSpécifications POSIX
POSIX requiert
-1
par défaut chaque fois que la sortie ne va pas vers un terminal:La spécification POSIX :
Ces trois options qui remplacent le format à colonne unique par défaut sont:
Documentation GNU
Depuis le manuel GNU ls :
Exemples
Créons trois fichiers:
Lorsque la sortie va vers un terminal, GNU
ls
choisit d'utiliser un format multi-colonnes:Lorsque la sortie est envoyée vers un pipeline, la spécification POSIX requiert que la colonne unique soit la valeur par défaut:
Les trois exceptions qui remplacent le comportement par défaut d'une seule colonne sont
-m
pour les virgules séparées,-C
pour les colonnes triées et-x
pour les colonnes triées sur:la source
-1
comme valeur par défaut, sauf lorsque la sortie va au terminal (ou dans d'autres conditions)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:qui est en fait ambigu au sujet du comportement par défaut (lorsqu'il n'est pas spécifié par une option comme
-l
ou-1
) avec une sortie vers un terminal, et la documentation GNU Coreutils ditAinsi, 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
-1
avait été spécifiée.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.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).ls -1
lorsque vous écrivez dans un fichier ou un tube? Non.la source
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.la source