Número de linhas geradas por ls

4

Quando ls é chamado, ele envia todos os arquivos / diretórios no diretório atual, tentando encaixar o maior número possível em cada linha. Por que, quando passado para wc -l , ele gera o número de arquivos? Como ele decide em quantas linhas os resultados são gerados?

    
por howardh 30.01.2013 / 17:27

2 respostas

11

Quando ls é executado, ele analisa várias opções. Ele também detecta se a saída é uma tty ou não por 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.

Se você quiser, pode compilar um teste simples:

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

Compile por:

gcc -o isawhat isawhat.c

Então, por exemplo:

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

A largura é medida em colunas. Uma coluna é um caractere. Começa com 80 , depois verifica se a variável de ambiente COLUMNS estiver definida e tiver um int válido que não seja maior que SIZE_MAX (que é dependente de arco - seu terminal nunca será tão amplo (pelo menos ainda não)).

Experimente, por exemplo %código%. Isso provavelmente reflete o número de colunas disponíveis na janela. À medida que a janela é redimensionada, atualize-se. É muito provável que também seja redefinido por vários comandos.

Uma maneira de definir um pouco mais é por echo $COLUMNS . Por exemplo. %código%. Use stty para ver todos (man stty). Um divertido pedaço de software.

Se compilado nele, consulte também as colunas em ioctl () , Detectar o tamanho da janela. . Passando o número de filiação de stdout para stty columns 60 e passando o pedido TIOCGWINSZ a estrutura stty -a é preenchida com o número de colunas.

Isso também pode ser demonstrado por um código c simples:

Compile, execute e redimensione a janela. Deve atualizar. Ctrl + C para sair.

#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;
}
    
por 30.01.2013 / 17:55
1

Quando a saída é direcionada para um descritor de arquivo diferente de um terminal (assim pipe, ou arquivo, ou algo parecido), ls se comporta como se fosse invocado como ls -1 .

    
por 30.01.2013 / 17:41

Tags