Tirets dans printf

37

J'essaie d'utiliser printf pour formater une jolie sortie dans un script bash

par exemple:
-----------------------
| This is some output |
-----------------------

Mais je suis tombé sur un comportement que je ne comprends pas.

$ printf "--" me donne l'erreur printf: usage: printf [-v var] format [arguments]

et $ printf "-stuff"aboutit à-bash: printf: -s: invalid option

Donc, apparemment, printf pense que j'essaie de passer des arguments alors que je ne le suis pas.

En attendant, complètement par accident, j'ai trouvé cette solution de contournement:
$ printf -- "--- this works now ----\n"me donne--- this works now ----

Quelqu'un peut-il expliquer ce comportement?

Kenny Rasschaert
la source
En dehors de l'interet, existe-t-il des implémentations echoqui échoueraient echo ------------? La plupart ne prennent en charge que -n(pas de nouvelle ligne), -e(interpréter les caractères avec une barre oblique inversée) et possible -E(ne PAS les interpréter) et ne pas se tromper lorsque d'autres arguments de type option sont rencontrés, n'est-ce pas? (EDIT: GNU /bin/echosupporte également --helpet --version.)
janmoesen

Réponses:

44

Le --est utilisé pour indiquer au programme que tout ce qui suit devrait pas être interprété comme une ligne de commande l' option pour printf.

Edit: Ainsi, printf "--"vous avez essentiellement essayé "printf sans arguments" et donc échoué.

sr_
la source
19
En d'autres termes, pour imprimer, --vous pouvez courir printf -- --.
l0b0
2
... et printf --est le même que printf(vous recevez le même message)
Peter.O
Notez que ce printf -- $fmtn'est pas portable. Sur busybox 1.30.1, printf -- '%s\n' hellorendements --. Voir aussi: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin
25

-- est interprété comme une option (dans ce cas, pour signifier qu'il n'y a plus d'options).

Une chaîne de format doit toujours être incluse lors de l’utilisation printfpour éviter une mauvaise interprétation. Pour votre cas particulier:

printf '%s\n' '-----------------------'
Chris Down
la source
Qu'en est-il lorsque vous devez faire cela avec une séquence? printf '-%.0s' {1..54}
Qodeninja
2
@qodeninja Ensuite , vous fait faire défaut à l' utilisation --:-)printf -- '-%.0s' {1..54}
Chris Bas
4

Il existe des différences entre printf builtin et / usr / bin / printf, le second fait "ce que vous voulez dire" sans ces erreurs gênantes.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
BOC
la source