Как printf с несколькими аргументами, разделенными пространством

У меня есть следующая функция printf :

 $ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt | git mktree 

Кто-нибудь может объяснить, что он производит и почему? Я ожидал иметь равное количество опций форматирования %s для каждой строки аргумента, но здесь у меня есть намного больше аргументов.

One Solution collect form web for “Как printf с несколькими аргументами, разделенными пространством”

Формат повторяется столько раз, сколько необходимо для отображения всех аргументов. Если аргументов слишком мало, недостающие аргументы рассматриваются как пустые строки.

Примеры

Ниже приведен пример формата, который указывает два аргумента, но предоставляется только один:

 $ printf '%s ; %s ;\n' a a ; ; 

Здесь тот же формат, на этот раз с одним слишком большим количеством аргументов:

 $ printf '%s ; %s ;\n' abc a ; b ; c ; ; 

Вот пример из вопроса, в котором формат ожидает четыре аргумента. Поскольку предусмотрено восемь аргументов, весь формат используется дважды:

 $ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt 

Документация

От человека bash:

Формат используется повторно для использования всех аргументов. Если в формате требуется больше аргументов, чем указано, спецификации дополнительного формата ведут себя так, как если бы было задано нулевое значение или нулевая строка. Возвращаемое значение равно нулю при успешном завершении, отличное от нуля при сбое.

  • Вставьте новые строки с отсутствующими значениями (NA)
  • Зарезервированные символы в именах файлов
  • Это ошибка, которую zsh печатает полную строку с printf '% .s'?
  • Почему scp говорит «Нет такого файла»?
  • Почему sed печатает первую строку из файла, даже если не удается найти соответствующие группы
  • курсор и объединение диакритики в оболочке
  • Экспортируйте vars env в окно tmux windows / сессии / панели
  • Переменные среды не устанавливаются, когда моя функция вызывается в конвейере
  • Экспорт истории команд в скрипт командной оболочки
  • Как переименовать несколько файлов с помощью сценария оболочки?
  • Bash перезаписывает первую строку при использовании пользовательской подсказки PS1
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.