Как ls -l форматирует свой вывод так аккуратно?

У меня есть следующее:

#
# Decrease swap usage to a workable level
vm.swappiness=10
# Improve cache management
vm.vfs_cache_pressure=50

Я думаю, вы можете просто использовать «0» вместо моего «10», но это должно работать.

1
задан 6 June 2016 в 20:38

1 ответ

В дополнение к ответу @muru, вот часть исходного кода, которая вычисляет width для правильного выравнивания вывода. :

static void
format_user_or_group (char const *name, unsigned long int id, int width)
{
  size_t len;

  if (name)
    {
      int width_gap = width - mbswidth (name, 0);
      int pad = MAX (0, width_gap);
      fputs (name, stdout);
      len = strlen (name) + pad;

      do
        putchar (' ');
      while (pad--);
    }
  else
    {
      printf ("%*lu ", width, id);
      len = width;
    }

  dired_pos += len + 1;
}

Используется, printf ("%*lu ", width, id);. ПРИМЕЧАНИЕ: спецификатор ширины поля переменной '*'

В этом случае нельзя предсказать, насколько велика ширина поля, в которой мы будем нуждаться, когда ls -l выполняется, то есть имена каталогов могут различаться по длине. Это означает, что сама ширина поля должна быть ПРИМЕЧАНИЕ: , для которой программа будет вычислять значение.

C использует программу , вычисленное значение в позиции спецификатора ширины поля, чтобы указать printf, что он найдет переменную, которая содержит значение ширины поля в качестве дополнительного параметра.

Например, предположим, что текущее значение ширины равно 5. Инструкция:

printf ("%*d%*d\n", width, 10, width, 11);

будет печатать: (обратите внимание на интервал)

   10   11
17
ответ дан 23 May 2018 в 10:19
  • 1
    [F1] здесь scontext_width, рассчитанный по gooble_file, другой функции, о которой я говорил. – muru 6 June 2016 в 21:31

Другие вопросы по тегам:

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