Guiones en printf

37

Estoy tratando de usar printf para formatear una salida bonita en un script bash

p.ej:
-----------------------
| This is some output |
-----------------------

Pero me he tropezado con un comportamiento que no entiendo.

$ printf "--" me da el error printf: usage: printf [-v var] format [arguments]

y $ printf "-stuff"resultados en-bash: printf: -s: invalid option

Entonces, aparentemente printf piensa que estoy tratando de pasar algunos argumentos mientras no lo estoy.

Mientras tanto, completamente por accidente, he encontrado esta solución:
$ printf -- "--- this works now ----\n"me da--- this works now ----

¿Alguien puede explicar este comportamiento?

Kenny Rasschaert
fuente
Fuera de interés, ¿hay alguna implementación de echoeso que fallaría al hacerlo echo ------------? La mayoría solo admite -n(sin línea posterior), -e(interpreta caracteres con barra invertida) y posible -E(NO los interpreta) y no genera errores cuando se encuentran otros argumentos similares a las opciones, ¿verdad? (EDITAR: GNU /bin/echotambién es compatible --helpy --version.)
Janmoesen

Respuestas:

44

El --se utiliza para indicar al programa que lo que sigue debe no ser interpretado como una línea de comandos opción a printf.

Editar: por lo tanto, lo printf "--"que intentó básicamente terminó como "printf sin argumentos" y, por lo tanto, falló.

sr_
fuente
19
En otras palabras, para imprimir --puedes correr printf -- --.
l0b0
2
... y printf --es lo mismo que printf(recibes el mismo mensaje)
Peter.O
Tenga en cuenta que printf -- $fmtno es portátil. En busybox 1.30.1, printf -- '%s\n' hellorendimientos --. Ver también: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin
25

-- se interpreta como una opción (en este caso, para indicar que no hay más opciones).

Siempre se debe incluir una cadena de formato cuando se usa printfpara evitar una mala interpretación. Para su caso particular:

printf '%s\n' '-----------------------'
Chris Down
fuente
¿Qué pasa cuando necesitas hacer esto con una secuencia? printf '-%.0s' {1..54}
qodeninja
2
Entonces @qodeninja que realmente hace que quiera usar --:-)printf -- '-%.0s' {1..54}
Chris abajo
4

Hay diferencias entre printf incorporado y / usr / bin / printf, el segundo hace "lo que quieres decir" sin estos molestos errores.

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