Що краще printf або відлуння?


16

Для відображення повідомлень та друку даних доступні дві команди printfта echo.
Тоді як по-іншому вони використовували? Що є більш кращим?


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


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.
тердон

Я працював у достатній кількості, щоб навіть не намагався уникати нових рядків із луною. Написання скриптів, які переносяться через SCO, AIX, HP-UX та Linux, є ... складним завданням.
Monty Harder

О, абсолютно ніяких аргументів немає. Я лише кажу, що новий рядок - це найменше проблем. Усі ставки знімаються, як тільки ви спробуєте перейти на систему, яка не є GNU. Я думаю, ви можете покластися на -nBSD і SystemV, але нічого іншого, я поняття не маю.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.