
Для отображения сообщения и печати данных доступны две команды printf
и echo
.
Тогда как по-разному они используются? Какая из них предпочтительнее?
решение1
Предпочтительный и наиболее широко используемый — это не одно и то же. Хотя printf
лучше по многим причинам, большинство людей все равно используют, echo
потому что синтаксис проще.
Основные причины, по которым вам следует отдать предпочтение printf
:
echo
не стандартизирован, он будет вести себя по-разному в разных системах.Трудно предсказать, что вы на самом деле запускаете, когда вы
echo foo
. Для иллюстрации, на моей системе Debian:$ type -a echo echo is a shell builtin echo is /bin/echo
Как вы можете видеть, есть две разные
echo
команды, одна из которых — встроенная оболочка (в данном случае bash), а другая — отдельный двоичный файл. Обратите внимание, чтоbash
у нее также естьprintf
встроенная команда, но ее поведение более стандартизировано, так что это не такая уж и проблема (спасибо @ RaduRădeanu за указание на нее).Поскольку некоторые (но не все) реализации
echo
поддерживают переключатели командной строки, сложно напечатать строку, которая начинается с-
. Хотя многие программы поддерживают--
обозначение конца переключателей и начала аргументов (например,grep -- -a file
найдет строки,file
содержащие-a
),echo
этого не происходит. Итак, как же получитьecho
print-n
?$ echo -n ## no output $ echo '-n' ## no output $ echo "-n" ## no output $ echo \-n ## no output $ echo -e '\055n' ## using the ASCII code works but only on implementations -n ## that support -e
printf
можно сделать это легко:$ printf -- '-n\n' -n $ printf '%s\n' -n -n $ printf '\055n\n' -n
Для получения более подробной информации о том, почему printf
лучше, чем echo
, см. этот ответ на аналогичный вопрос наhttp://unix.stackexchange.com:
решение2
Вопрос о том, что предпочтительнее, сам по себе неполный.
Если все, что нужно сделать, это вывести одну или несколько строк текстазавершено новой строкой, то echo достаточно. Если предполагается что-то более умное, в частности, включение "частичной строки", не содержащей символа новой строки, то printf лучше всегодля этой цели.