Ketika ls
dipanggil, ini menampilkan semua file/direktori di direktori saat ini, mencoba untuk memuat sebanyak mungkin pada setiap baris. Mengapa ketika diteruskan ke wc -l
, itu menampilkan jumlah file? Bagaimana cara menentukan berapa banyak baris untuk menampilkan hasilnya?
Jawaban yang Diterima:
Ketika ls
dieksekusi itu mem-parsing berbagai opsi. Itu juga mendeteksi apakah output adalah tty atau tidak oleh isatty().
ls.c:
kode
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;
…
kode
/* disable -l */
if (format == long_format)
format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
dll.
Jika mau, Anda dapat mengkompilasi tes sederhana:
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;
}
Dikompilasi oleh:
gcc -o isawhat isawhat.c
Kemudian misalnya:
$ ./isawhat | sed 's/word/world/'
Lebar diukur dalam kolom. Satu kolom adalah satu karakter. Ini dimulai dengan 80, lalu periksa apakah variabel lingkungan COLUMNS diatur dan memegang int valid yang tidak lebih besar dari SIZE_MAX (Yang bergantung pada lengkungan – terminal Anda tidak akan pernah selebar itu (setidaknya belum)).
Coba mis. echo $COLUMNS
. Ini kemungkinan besar mencerminkan jumlah kolom yang Anda miliki di jendela. Saat jendela diubah ukurannya - ini diperbarui. Kemungkinan besar juga disetel ulang dengan berbagai perintah.
Salah satu cara untuk mengaturnya sedikit lebih sulit adalah dengan stty
. Misalnya. stty columns 60
. Gunakan stty -a
untuk melihat semua (man stty). Perangkat lunak yang menyenangkan.
Jika dikompilasi di dalamnya juga meminta kolom dengan ioctl(), Ukuran jendela mendeteksi.. Dengan meneruskan nomor file untuk stdout ke ioctl
dan meneruskan permintaan TIOCGWINSZ struktur winsize
diisi dengan jumlah kolom.
Ini juga dapat ditunjukkan dengan kode-c sederhana:
Kompilasi, jalankan dan ubah ukuran jendela. Harus memperbarui. Ctrl+C untuk keluar.
#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;
}