Qual é a melhor impressão ou eco?

16

Para exibir dados de mensagens e imprimir, existem dois comandos disponíveis printfe echo.
Então, o quão diferente eles usaram? Qual é o mais preferível?

Pandya
fonte
8
Você encontrará a resposta aqui: unix.stackexchange.com/a/65819
user218740

Respostas:

27

Preferível e mais utilizado não é a mesma coisa. Embora printfseja melhor por vários motivos, a maioria das pessoas ainda o usa echoporque a sintaxe é mais simples.

As principais razões pelas quais você prefere printfsão:

  1. echo não for padronizado, ele se comportará de maneira diferente em sistemas diferentes.
  2. É 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 echocomandos diferentes , um é um shell (bash neste caso) embutido e outro é um binário separado. Observe que bashtambém possui um printfbuilt-in, mas seu comportamento é mais padronizado, tornando-o menos problemático (obrigado a @ RaduRădeanu por apontar isso).

  3. Como algumas implementações (mas não todas) de echoopções de linha de comando de suporte, é difícil imprimir uma sequência que comece com a -. Enquanto muitos programas suportam --para significar o fim das opções e o início dos argumentos (por exemplo, grep -- -a fileencontrarão linhas fileque contêm -a), echoisso não acontece. Então, como você echoimprime -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 mais informações do que você sempre quis saber sobre por que printfé melhor do que echo, veja esta resposta a uma pergunta semelhante sobre http://unix.stackexchange.com :

/unix//a/65819/22222

Terdon
fonte
11
Dada uma boa resposta. Isso me ajuda a preferir printfcomo melhor intérprete.
213
3
No ponto 2: o mesmo vale para printf(ver type -a).
Radu Rădeanu 16/05
2
@ RaduRădeanu true, mas printfé mais rigidamente definido no POSIX e acho que o builtin segue o mesmo padrão. As especificações do POSIX, por echooutro lado, são menos rigorosas e até explicitamente afirmam que haverá diferenças entre as implementações e que printfdevem ser preferidas.
terdon 16/05
Uau. Portanto, existem literalmente zero vantagens técnicas objetivas no uso echo. Isso está correto?
JamesTheAwesomeDude
11
@JamesTheAwesomeDude não, absolutamente nenhuma vantagem técnica. A única razão para usar echoem vez de printfé que a forma pode ser mais simples. Se você souber o que está imprimindo, echo fooé mais rápido e fácil digitar do que printf 'foo\n'. Além disso, ao escrever scripts em que uma variável precisa ser impressa, nunca há uma boa razão para usar echo.
terdon 2/16
4

Perguntar o que é preferível é incompleto.

Se tudo o que se deseja é emitir uma ou mais linhas de texto terminadas por novas linhas , o eco é suficiente. Se algo mais inteligente for pretendido, incluindo especificamente uma "linha parcial" que não possui a nova linha, então printf é melhor para esse fim .

Monty Harder
fonte
Dependendo da echoimplementação, "evitar a nova linha" é fácil echo -n. De fato, -né o mais portátil dos recursos do eco. De acordo com o POSIX, ele está ausente do SystemV, mas está presente na maioria dos Unices.
terdon 16/05
Já trabalhei em unidades diferentes o suficiente para nem tentar evitar novas linhas com eco. Escrever scripts portáteis em SCO, AIX, HP-UX e Linux é ... desafiador.
Monty Harder
Oh absolutamente, não há argumento lá. Tudo o que estou dizendo é que a nova linha é o menor dos problemas. Todas as apostas são desativadas assim que você tenta portar para um sistema não-GNU. Eu acho que você pode confiar no -nBSDs e SystemV, mas qualquer outra coisa, não faço ideia.
terdon 16/05