Какой лучше printf или echo?

16

Для отображения сообщения и печати данных доступны две команды printfи echo.
Тогда как иначе они использовали? Что предпочтительнее?

Pandya
источник
8
Вы найдете ответ здесь: unix.stackexchange.com/a/65819
user218740

Ответы:

27

Предпочтительный и наиболее широко используемый - это не одно и то же. Хотя printfэто лучше по многим причинам, большинство людей все еще используют, echoпотому что синтаксис проще.

Основными причинами, по которым вам следует отдать предпочтение, printfявляются:

  1. echo не стандартизирован, он будет вести себя по-разному в разных системах.
  2. Трудно предсказать, что ты на самом деле бежишь, когда ты echo foo. Для иллюстрации в моей системе Debian:

    $ type -a echo
    echo is a shell builtin
    echo is /bin/echo
    

    Как видите, есть две разные echoкоманды: одна представляет собой встроенную оболочку (в нашем случае bash), а другая - отдельный двоичный файл. Обратите внимание, что bashтакже имеетprintf встроенную но его поведение более стандартизировано, поэтому это не проблема (спасибо @ RaduRădeanu за указание на это).

  3. Поскольку некоторые (но не все) реализации echoпереключателей поддержки командной строки трудно распечатать строку, которая начинается с -. Хотя многие программы поддерживают --указывать конец переключателей и начало аргументов (например, grep -- -a fileнайдут строки, fileкоторые содержат -a), echoэтого не происходит. Итак, как у вас есть echoпечать -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. :

/unix//a/65819/22222

terdon
источник
1
Дан хороший ответ. Это помогает мне выбрать printfлучшего переводчика.
Пандя,
3
В точке 2: то же самое верно для printf(см. type -a).
Раду Рэдяну
2
@ RaduRădeanu верно, но printfболее жестко определено в POSIX, и я думаю, что встроенная программа следует тому же стандарту. В POSIX спецификация для echoдругой стороны , является менее строгой и даже явно заявляет , что будет различие между реализациями и что printfдолжно быть предпочтительным.
Тердон
Вау. Таким образом, в использовании практически нет объективных технических преимуществ echo. Это верно?
JamesTheAwesomeDude
1
@JamesTheAwesomeDude нет, абсолютно никаких технических преимуществ вообще. Единственная причина для использования, echoа не printfв том, что форма может быть проще. Если вы знаете, что вы печатаете, echo fooэто быстрее и проще, чем печатать printf 'foo\n'. Кроме того, при написании сценариев, в которых необходимо печатать переменную, нет веских причин для использования echo.
Тердон
4

Спросить, что предпочтительнее, само по себе неполноценно.

Если все, что вы хотите сделать, это испустить одну или несколько строк текста, оканчивающихся символами новой строки , то достаточно эхо. Если предполагается что-то более умное, в частности, включающее «частичную строку», в которой нет новой строки, тогда printf лучше всего подходит для этой цели .

Монти Хардер
источник
В зависимости от echoреализации «избежать новой строки» легко echo -n. На самом деле, -nэто самая портативная из функций эха. Согласно POSIX, он отсутствует в SystemV, но присутствует в большинстве Unices.
Тердон
Я работал в достаточно разных отделениях, чтобы даже не пытаться избегать перевода строки с помощью echo. Написание сценариев, которые можно переносить в SCO, AIX, HP-UX и Linux, является ... сложной задачей.
Монти Хардер
О, абсолютно, нет аргументов там. Все, что я говорю, это то, что новая строка - это наименьшая из проблем. Все ставки отключены, как только вы попытаетесь портировать на не-GNU систему. Я думаю, что вы можете положиться на -nBSD и SystemV, но что-нибудь еще, я понятия не имею.
Тердон