Je pense que je peux négliger un point relativement fondamental concernant la coquille. La sortie de la commande ls par défaut sépare la sortie avec des nouvelles lignes, mais le shell affiche la sortie sur une seule ligne.
Quelqu'un peut-il m'expliquer cela? J'avais toujours supposé que la sortie était simplement séparée par des espaces, mais maintenant que je vois la sortie séparée par des nouvelles lignes, je m'attendrais à ce que la sortie s'affiche sur des lignes séparées.
Exemple:
cpoweradm@debian:~/lpi103-4$ ls text*
text1 text2 text3
od montre que la sortie est séparée par des nouvelles lignes:
cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000 t e x t 1 \n t e x t 2 \n t e x t
0000020 3 \n
0000022
Si les nouvelles lignes sont présentes, alors pourquoi la sortie ne s'affiche-t-elle pas sous la forme:
text1
text2
text3
ls
. C'est utile, mais clairement incohérent et surprenant. Notez cependant que certaines commandes produisant une sortie colorée effacent également les couleurs lorsqu'elles sont redirigées.ls
en imprime toujours un par ligne etlc
toujours en colonnes.dpkg -l
utilisera toute la largeur de l'écran, mais si vous imprimez sur un tuyau, le terminal suppose une largeur de 80 colonnes. , et abrége la sortie pour l’adapter si nécessaire.Votre découverte met en évidence la raison principale pour laquelle analyser la sortie de
ls
est toujours une mauvaise idée. Voir le wiki de Greg pour une explication complète .Pensez à votre problème en sens inverse. Vous avez remarqué que ls imprime et parfois n'imprime pas de nouvelles lignes entre ses sorties. Pour une utilisation dans des scripts ou lorsque forcé par le
-1
drapeau, c'est le cas. Une nouvelle ligne à la fin de chaque fichier. Rien ne garantit que chaque nouvelle ligne représente un nouveau nom de fichier . En fait, si un nom de fichier contient une nouvelle ligne elle-même, la sortie de ls sera absolument impossible à analyser. Considérez ces noms de fichiers:Lorsque vous avez
ls -1
un répertoire contenant cela, vous obtenez quelque chose qui ressemble à ceci:Ne penseriez-vous pas naturellement qu'il y avait quatre fichiers? Il en serait de même des scripts qui analysent la sortie de ls. En réalité, il y a trois fichiers, l'un avec un nom compliqué, mais vous ne pourriez pas le savoir à partir de la sortie de ls. *
* À moins que vous n'utilisiez le
-l
drapeau et que vous remarquiez que la sortie était bouchée, mais vos scripts resteraient quand même étouffés.la source
ls
, l'-b
option peut vous aider. Il transforme la nouvelle ligne en\n
, etc.