Подавление печати строки total с помощью ls -l

Это было вызвано обработкой команды not-found в Fedora.

Выполнение неизвестной команды (включая ... и т.д., если не совпадает псевдоним) приводит к запуску command_not_found_handle с отсутствующей командой в качестве параметра (см. определение /etc/profile.d/PackageKit.sh). В данном сценарии обработчик запускает /usr/libexec/pk-command-not-found, снова с отсутствующей командой в качестве параметра. Ранее pk-command-not-found просто игнорировал любую команду, начинающуюся с . :

if (argv[1][0] == '.')
    goto out;

и завершалась с кодом 127.

Это поведение было введено для исправления Red Hat #1151185, также упоминается в Bash does not print any error msg upon non-existing commands starting with dot, и имеет ошибку, требующую исправления (Red Hat #1292531). В основном она была исправлена в FC 27 с обновлениями, начиная с PackageKit 1.1.8 (см. this commit): теперь команды с ведущими точками обрабатываются, только . и . игнорируются.

4
23.04.2020, 23:03
1 ответ

Нет, вам не хватает простой опции, позволяющей отказаться от строки total, по крайней мере, при перечислении содержимого каталога (включая текущий, без аргументов). Например, в GNU ls опции -l, -g, -n, -o и -s вызывают отображение строки total без возможности ее отключения:

if (format == long_format || print_block_size)
{
  const char *p;
  char buf[LONGEST_HUMAN_READABLE + 1];

  DIRED_INDENT ();
  p = _("total");
  DIRED_FPUTS (p, stdout, strlen (p));
  DIRED_PUTCHAR (' ');
  p = human_readable (total_blocks, buf, human_output_opts,
                      ST_NBLOCKSIZE, output_block_size);
  DIRED_FPUTS (p, stdout, strlen (p));
  DIRED_PUTCHAR ('\n');
}

Это фактически предписано POSIX.

Однако, если вы укажете файлы для списка, а не каталог, ls не покажет общее количество; опция -d заставляет рассматривать каталоги как файлы, что дает желаемый результат, как упоминал Костас:

ls -ld *

выдаст тот же результат, что и

ls -l

за вычетом строки total, если ваша оболочка не включает скрытые файлы при расширении * (dotglob) и если текущий каталог не содержит так много файлов, что расширение * превышает максимальную длину командной строки.

Вы можете указать и каталог (ls -ld /path/to/directory/*), но в результате будут перечислены файлы с заданным путем, в отличие от ls -l /path/to/directory.

7
29.04.2021, 00:08

Теги

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