Wenn ls
aufgerufen wird, gibt es alle Dateien/Verzeichnisse im aktuellen Verzeichnis aus und versucht, so viele wie möglich in jede Zeile zu passen. Warum ist das so, wenn es an wc -l
übergeben wird , es gibt die Anzahl der Dateien aus? Wie entscheidet es, in wie vielen Zeilen seine Ergebnisse ausgegeben werden?
Akzeptierte Antwort:
Wenn ls
ausgeführt wird, analysiert es verschiedene Optionen. Es erkennt auch, ob die Ausgabe ein tty ist oder nicht durch 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);
usw.
Wenn Sie möchten, können Sie einen einfachen Test kompilieren:
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;
}
Kompilieren durch:
gcc -o isawhat isawhat.c
Dann z.B.:
$ ./isawhat | sed 's/word/world/'
Die Breite wird in Spalten gemessen. Eine Spalte ist ein Zeichen. Es beginnt mit 80, dann prüfen Sie, ob die Umgebungsvariable COLUMNS gesetzt ist und eine gültige Ganzzahl enthält, die nicht größer als SIZE_MAX ist (was vom Arch abhängig ist – Ihr Terminal wird niemals so breit sein (zumindest noch nicht)).
Versuchen Sie z. echo $COLUMNS
. Es spiegelt höchstwahrscheinlich die Anzahl der Spalten wider, die Sie im Fenster zur Verfügung haben. Wenn die Größe des Fensters geändert wird, wird dies aktualisiert. Es wird höchstwahrscheinlich auch durch verschiedene Befehle zurückgesetzt.
Eine Möglichkeit, es etwas schwieriger einzustellen, ist stty
. Z.B. stty columns 60
. Verwenden Sie stty -a
um alle anzuzeigen (man stty). Ein lustiges Stück Software.
Wenn darin einkompiliert, auch Abfrage nach Spalten durch ioctl(), Erkennung der Fenstergröße. Durch Übergabe der Dateinummer für stdout an ioctl
und Übergeben der Anfrage TIOCGWINSZ der Struktur winsize
mit der Anzahl der Spalten gefüllt werden.
Dies kann auch durch einen einfachen C-Code demonstriert werden:
Fenster kompilieren, ausführen und Größe ändern. Sollte aktualisieren. Strg+C zum Beenden.
#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: %dr",
"Columns", ws.ws_col,
"Rows", ws.ws_row
);
fflush(stdout);
}
usleep(5000);
}
fprintf(stdout, "n");
return 0;
}