GNU/Linux >> Tutoriales Linux >  >> Linux

¿Número de líneas emitidas por Ls?

Cuando ls se llama, genera todos los archivos/directorios en el directorio actual, intentando colocar tantos como sea posible en cada línea. ¿Por qué cuando se pasa a wc -l , genera el número de archivos? ¿Cómo decide en cuántas líneas mostrar sus resultados?

Respuesta aceptada:

Cuando ls se ejecuta, analiza varias opciones. También detecta si la salida es un tty o no mediante isatty().

ls.c:

código

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;

código

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

etc.

Si quieres puedes compilar una prueba 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;
}

Compilar por:

gcc -o isawhat isawhat.c

Entonces, por ejemplo:

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

El ancho se mide en columnas. Una columna es un carácter. Comienza con 80, luego verifique si la variable de entorno COLUMNS está configurada y tiene un int válido que no es mayor que SIZE_MAX (que depende del arco:su terminal nunca será tan ancho (al menos no todavía)).

Prueba, p. echo $COLUMNS . Lo más probable es que refleje la cantidad de columnas que tiene disponibles en la ventana. A medida que la ventana cambia de tamaño, esto se actualiza. Lo más probable es que también se restablezca con varios comandos.

Una forma de hacerlo un poco más difícil es stty . P.ej. stty columns 60 . Usa stty -a para ver todo (hombre stty). Una divertida pieza de software.

Si está compilado en él, también consulta las columnas mediante ioctl(), detección de tamaño de ventana. Al pasar el número de archivo para stdout a ioctl y pasando la solicitud TIOCGWINSZ la estructura winsize se llena con el número de columnas.

Esto también se puede demostrar con un código c simple:

Compila, ejecuta y cambia el tamaño de la ventana. Debería actualizar. Ctrl+C para salir.

#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. Encuentre el número de líneas de código del repositorio de GitHub

  2. ¿Ordenar y contar el número de ocurrencias de líneas?

  3. ¿Dividir archivo por número de líneas, incluido el encabezado en cada una?

  4. ¿Cómo imprimir las líneas número 15 y 25 de cada 50 líneas?

  5. ¿Cómo contar el número de líneas en un archivo después de una coincidencia Grep?

Comando Wc en Linux (Cuenta Número de Líneas, Palabras y Caracteres)

Comando WC de Linux para contar el número de líneas, palabras y caracteres

5 formas de contar el número de líneas en un archivo

Ejemplos de comandos de WC:contar el número de líneas, palabras y caracteres en Linux

¿Cómo contar el número total de líneas de archivos encontrados?

reemplazar líneas en un archivo con líneas en otro por número de línea