Nombre de lignes produites par ls

Quand ls est appelé, il sort tous les files / directorys dans le directory courant, essayant d'en mettre autant que possible sur chaque ligne. Pourquoi est-ce que lorsqu'il est passé à wc -l , il sort le nombre de files? Comment décide-t-il du nombre de lignes pour produire ses résultats?

Lorsque ls est exécuté, il parsing différentes options. Il détecte également si la sortie est un tty ou non par isatty () .

ls.c:

code

 case LS_LS: /* This is for the `ls' program. */ if (isatty (STDOUT_FILENO)) { format = many_per_line; /* See description of qmark_funny_chars, above. */ qmark_funny_chars = true; } else { format = one_per_line; qmark_funny_chars = false; } break; 

code

  /* disable -l */ if (format == long_format) format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line); 

etc.


Si vous voulez, vous pouvez comstackr un test simple:

isawhat.c

 #include <stdio.h> #include <unistd.h> int main(void) { if (isatty(STDOUT_FILENO)) { fprintf(stdout, "Word by word my world.\n"); } else { fprintf(stdout, "HELP! Stranger handling my words!!\n"); } fprintf(stderr, "Bye bye.\n"); return 0; } 

Comstackr par:

 gcc -o isawhat isawhat.c 

Alors par exemple:

 $ ./isawhat | sed 's/word/world/' 

La largeur est mesurée en colonnes. Une colonne est un caractère. Il commence par 80 , puis vérifie si la variable d'environnement COLUMNS est définie et contient un int valide qui n'est pas plus grand que SIZE_MAX (qui est dépendant de l'arc – votre terminal ne sera jamais aussi large (du less pas encore)).

Essayez par exemple echo $COLUMNS . Cela reflète très probablement le nombre de colonnes disponibles dans la window. Lorsque la window est redimensionnée, elle est mise à jour. Il est probablement aussi réinitialisé par diverses commands.

Une façon de le mettre un peu plus dur est par stty . Par exemple stty columns 60 . Utilisez stty -a pour voir tout (man stty). Un morceau de logiciel amusant.

Si elle est compilée, requestz également des colonnes par ioctl () , la taille de la window détecte. . En passant le numéro de file pour stdout à ioctl et en passant la requête TIOCGWINSZ, la structure winsize est remplie avec le nombre de colonnes.

Cela peut également être démontré par un simple code-c:

Comstackr, exécuter et resize la window. Devrait mettre à jour. Ctrl + C pour quitter.

 #include <stdio.h> #include <unistd.h> #include <sys/ioctl.h> #include <signal.h> static int run; void sig_handler(int sig) { switch (sig) { case SIGINT: case SIGTERM: case SIGSTOP: run = 0; break; } } void sig_trap(int sig) { if ((signal(sig, sig_handler)) == SIG_IGN) signal(sig, SIG_IGN); } int main(void) { struct winsize ws; sig_trap(SIGINT); sig_trap(SIGTERM); sig_trap(SIGSTOP); run = 1; while (run) { if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1) { fprintf(stdout, "\r %s: %3d, %s: %d\r", "Columns", ws.ws_col, "Rows", ws.ws_row ); fflush(stdout); } usleep(5000); } fprintf(stdout, "\n"); return 0; } 

Lorsque la sortie est dirigée vers un descripteur de file autre qu'un terminal (pipe, file ou autre), ls se comporte comme s'il était invoqué comme ls -1 .