printf
(print formatted, функция форматированного вывода) - встроенная функция bash; есть и бинарник, обычно, в дистрибутивах, но он будет работать только, если указать вызвать его конкретно (/usr/bin/env
илиenv printf
).
Определена в стандарте POSIX (в отличие от (тоже) встроенной в bash функцииecho
), поэтому лучше переносима с POSIX-совместимыми системами.
printf
, в отличие от echo
, не добавляет по дефолту перевод строки.
Управляющие последовательности (\n
и т.п.) будут интерпретироваться и в одинарных, и в двойных кавычках.
Дата/время в printf
В bash 4.2 добавили поддержку спецификатора формата printf %(datj_format)T
, которая по дефолту выводила дату начала эпохи Unix (1970-01-01 00:00:00 -0000).
В bash 4.3 дефолтное значение стало полезней - выводились текущие дата и время. Спецификатор имеет два спец. аргумента: -1
- текущие дата и время, -2
- дата и время вызова оболочки.
С помощью printf -v var
можно сохранить вывод в переменную var
вместо вывода на экран (подобно функции sprintf
в C):
printf
можно юзать для простого логирования:
Команда date
в этом плане лучше, чем printf %(date_format)T
, ибо позволяет выполнять арифметические действия с датами, например:
Но printf %(date_format)T
дает возможность не создавать подоболочку для запуска date. Это удобно, если нужно просто зафиксировать время (например, при логировании).
С помощью него можно узнать, например, какой дате и времени соответствуют 1072632362 секунд:
printf
для повторного использования или отладки
%q
экранирует символы в аргументе, позволяя юзать его повторно в качестве ввода.
Такое может пригодится для повторного использования в другом месте, создания форматированного вывода и отладки, когда нужно видеть скрытые управляющие символы и поля.
Соус: Книга Идиомы Bash → Глава 6. Функции → Функция printf