
Para exibir mensagens e dados de impressão, existem dois comandos disponíveis printf
e echo
.
Então, quão diferentemente eles usaram? O que é mais preferível?
Responder1
Preferível e mais utilizado não é a mesma coisa. Embora printf
seja melhor por vários motivos, a maioria das pessoas ainda usa echo
porque a sintaxe é mais simples.
Os principais motivos pelos quais você deve preferir printf
são:
echo
não for padronizado, ele se comportará de maneira diferente em sistemas diferentes.É difícil prever o que você realmente está executando quando
echo foo
. Para ilustrar, no meu sistema Debian:$ type -a echo echo is a shell builtin echo is /bin/echo
Como você pode ver, existem dois
echo
comandos diferentes, um é um shell (neste caso, bash) integrado e outro é um binário separado. Observe que elebash
também possui umprintf
recurso interno, mas seu comportamento é mais padronizado, portanto é menos problemático (obrigado a @ RaduRădeanu por apontar isso).Como algumas (mas não todas) implementações de
echo
opções de linha de comando suportam, é difícil imprimir uma string que comece com a-
. Embora muitos programas suportem--
para indicar o fim das opções e o início dos argumentos (por exemplo,grep -- -a file
encontrarão linhasfile
que contêm-a
),echo
isso não acontece. Então, como vocêecho
imprime-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
pode fazer isso facilmente:$ printf -- '-n\n' -n $ printf '%s\n' -n -n $ printf '\055n\n' -n
Para obter mais informações do que você gostaria de saber sobre por que printf
é melhor que echo
, consulte esta resposta a uma pergunta semelhante emhttp://unix.stackexchange.com:
Responder2
Perguntar o que é preferível é, por si só, incompleto.
Se tudo o que se deseja fazer é emitir uma ou mais linhas de textoencerrado por novas linhas, então echo é suficiente. Se for pretendido algo mais inteligente, incluindo especificamente uma "linha parcial" que não possui a nova linha, então printf é melhorpara aquele propósito.