GNU/Linux >> Belajar Linux >  >> Linux

Jumlah Baris Dikeluarkan Oleh Ls?

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;
}

Linux
  1. Temukan jumlah Baris Kode dari Repositori GitHub

  2. Bagaimana Menemukan Jumlah Garis Vertikal Yang Tersedia Di Terminal?

  3. Pisahkan File Dengan Jumlah Baris Termasuk Header Di Masing-Masing?

  1. Bagaimana Cara Mencetak Baris Nomor 15 Dan 25 Dari Setiap 50 Baris?

  2. Gambarkan Secara Acak Sejumlah Garis Dari File Data?

  3. Gambarlah sejumlah garis secara acak dari file data

  1. Urutkan Dan Hitung Jumlah Terjadinya Garis?

  2. Bagaimana Menghitung Jumlah Baris Dalam File Setelah Pertandingan Grep?

  3. ganti baris dalam satu file dengan baris lain dengan nomor baris