Количество строк производится ls

От help let:

Exit Status:
If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise..

С тех пор var++ постинкремент, я предполагаю, что последний аргумент действительно оценивает для обнуления. Тонкий...

Возможно, более четкая иллюстрация:

$ let x=-1 ; echo x=$x \$?=$?
x=-1 $?=0
$ let x=0 ; echo x=$x \$?=$?
x=0 $?=1
$ let x=1 ; echo x=$x \$?=$?
x=1 $?=0
$ let x=2 ; echo x=$x \$?=$?
x=2 $?=0
4
30.01.2013, 18:27
2 ответа

Когда ls выполняется это анализирует различные варианты. Это также обнаруживает, если произведенный tty или не isatty ().

ls.c:

код

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;

...

код

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

и т.д.


Если Вы хотите Вас, может скомпилировать простой тест:

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

Компиляция:

gcc -o isawhat isawhat.c

Затем, например:

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

Ширина измеряется в столбцах. Один столбец является одним символом. Это начинается с 80, затем проверьте, установлены ли СТОЛБЦЫ переменной среды и содержат допустимый интервал, который не больше затем SIZE_MAX (Который является иждивенцем дуги - Ваш терминал никогда не будет настолько широк (по крайней мере еще)).

Попробуйте, например. echo $COLUMNS. Это по всей вероятности отражает число столбцов, которые Вы имеете в наличии в окне. Поскольку окно изменено - это обновляется. Это по всей вероятности также сбрасывается различными командами.

Один способ установить его немного тяжелее stty. Например. stty columns 60. Использовать stty -a просмотреть все (человек stty). Забавная часть программного обеспечения.

Если скомпилировано в нем также запрашивают для столбцов ioctl (), Размер окна обнаруживают.. Путем передачи filenumber для stdout к ioctl и передача запроса TIOCGWINSZ структура winsize будьте заполнены числом столбцов.

Это может также быть продемонстрировано простым c-кодом:

Скомпилируйте, выполните и измените размер окна. Должен обновить. Ctrl+C для выхода.

#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;
}
11
27.01.2020, 20:47

Когда произведенный направлен в дескриптор файла кроме терминала (таким образом канал или файл, и т.п.), ls ведет себя, как будто это было вызвано как ls -1.

1
27.01.2020, 20:47
  • 1
    Вывод всегда переходит к stdout. Что количества, является ли stdout терминалом или нет. Это - читает ли пользователь его вывод или нет. –  Stéphane Chazelas 30.01.2013, 19:44

Теги

Похожие вопросы