Trattini in stampa


37

Sto cercando di usare printf per formattare alcuni output piuttosto in uno script bash

per esempio:
-----------------------
| This is some output |
-----------------------

Ma mi sono imbattuto in alcuni comportamenti che non capisco.

$ printf "--" mi dà l'errore printf: usage: printf [-v var] format [arguments]

e $ printf "-stuff"risulta in-bash: printf: -s: invalid option

Quindi apparentemente printf pensa che sto cercando di passare alcuni argomenti mentre non lo sono.

Nel frattempo, completamente per caso, ho trovato questa soluzione alternativa:
$ printf -- "--- this works now ----\n"mi dà--- this works now ----

Qualcuno può spiegare questo comportamento?



A parte l'intereset, ci sono delle implementazioni echoche fallirebbero nel farlo echo ------------? La maggior parte supporta solo -n(nessuna nuova riga finale), -e(interpreta i caratteri con escape di barra rovesciata) e possibile -E(NON interpretarli) e non sbagliare quando si incontrano altri argomenti simili a opzioni, giusto? (EDIT: GNU's /bin/echosupporta anche --helpe --version.)
janmoesen,

Risposte:


44

Il --viene utilizzato per indicare al programma che tutto ciò che segue dovrebbe non essere interpretato come una riga di comando l'opzione a printf.

Modifica: Quindi il printf "--"tentativo che hai provato è finito per essere "printf senza argomenti" e quindi fallito.


19
In altre parole, per stampare --è possibile eseguire printf -- --.
l0b0

2
... ed printf --è lo stesso di printf(ricevi lo stesso messaggio)
Peter.O

Si noti che printf -- $fmtnon è portatile. Su busybox 1.30.1, printf -- '%s\n' hellorendimenti --. Vedi anche: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin

25

-- viene interpretato come un'opzione (in questo caso, per indicare che non ci sono più opzioni).

Una stringa di formato deve sempre essere inclusa quando si utilizza printfper evitare interpretazioni errate. Per il tuo caso particolare:

printf '%s\n' '-----------------------'

che dire di quando è necessario farlo con una sequenza? printf '-%.0s' {1..54}
qodeninja,

2
@qodeninja Poi in realtà fai desidera utilizzare --:-)printf -- '-%.0s' {1..54}
Chris giù

4

Ci sono differenze tra printf builtin e / usr / bin / printf, il secondo fa "quello che vuoi dire" senza questi fastidiosi errori.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.