Traços em printf

37

Estou tentando usar printf para formatar uma saída bonita em um script bash

por exemplo:
-----------------------
| This is some output |
-----------------------

Mas me deparei com um comportamento que não entendo.

$ printf "--" me dá o erro printf: usage: printf [-v var] format [arguments]

e $ printf "-stuff"resulta em-bash: printf: -s: invalid option

Aparentemente, printf acha que estou tentando passar alguns argumentos enquanto não estou.

Enquanto isso, completamente por acidente, encontrei esta solução alternativa:
$ printf -- "--- this works now ----\n"me dá--- this works now ----

Alguém pode explicar esse comportamento?

Kenny Rasschaert
fonte
11
Veja também unix.stackexchange.com/questions/11376/…
manatwork
Fora do intereset, existem implementações echoque falhariam ao fazer isso echo ------------? A maioria suporta apenas -n(sem nova linha à direita), -e(interpreta caracteres com escape de barra invertida) e possível -E(NÃO os interpreta) e não comete erros quando outros argumentos do tipo opção são encontrados, certo? (EDIT: GNU's /bin/echotambém suporta --helpe --version).
janmoesen

Respostas:

44

O --é usado para informar ao programa que o que se segue não deve ser interpretado como uma opção de linha de comando para printf.

Edit: Assim, o que printf "--"você tentou basicamente acabou como "printf sem argumentos" e, portanto, falhou.

sr_
fonte
19
Em outras palavras, para imprimir, --você pode executar printf -- --.
L0b0 17/10/11
2
... e printf --é o mesmo que printf(você recebe a mesma mensagem)
Peter.O
Observe que printf -- $fmtnão é portátil. No busybox 1.30.1, printf -- '%s\n' helloproduz --. Veja também: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin
25

-- está sendo interpretado como uma opção (nesse caso, para indicar que não há mais opções).

Uma string de formato sempre deve ser incluída ao ser usada printfpara evitar más interpretações. Para o seu caso particular:

printf '%s\n' '-----------------------'
Chris Down
fonte
e quando você precisa fazer isso com uma sequência? printf '-%.0s' {1..54}
qodeninja 18/08
2
@qodeninja Então você realmente fazer querer usar --:-)printf -- '-%.0s' {1..54}
Chris Baixo
4

Existem diferenças entre o printf builtin e / usr / bin / printf, o segundo faz o que você quer dizer sem esses erros irritantes.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
BOC
fonte