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
.