Striche in printf

37

Ich versuche, printf zu verwenden, um einige hübsche Ausgaben in einem Bash-Skript zu formatieren

z.B:
-----------------------
| This is some output |
-----------------------

Aber ich bin über ein Verhalten gestolpert, das ich nicht verstehe.

$ printf "--" gibt mir den fehler printf: usage: printf [-v var] format [arguments]

und $ printf "-stuff"führt zu-bash: printf: -s: invalid option

Anscheinend glaubt printf, ich würde versuchen, ein paar Argumente zu übergeben, ohne dass ich es tue.

Inzwischen habe ich ganz zufällig diese Problemumgehung gefunden:
$ printf -- "--- this works now ----\n"gibt mir--- this works now ----

Kann jemand dieses Verhalten erklären?

Kenny Rasschaert
quelle
Gibt es Implementierungen, bei echodenen dies fehlschlagen würde echo ------------? Die meisten unterstützen nur -n(keine abschließenden Zeilenumbrüche), -e(interpretieren Zeichen mit umgekehrten Schrägstrichen) und sind möglich -E(interpretieren Sie sie NICHT). (BEARBEITEN: GNU /bin/echounterstützt auch --helpund --version.)
Januar

Antworten:

44

Das --wird verwendet , um das Programm zu sagen , dass alles , was folgt sollte nicht als Befehlszeile interpretiert werden Option zu printf.

Edit: Also das printf "--"du im Grunde versucht hast endete als "printf ohne Argumente" und ist damit gescheitert.

sr_
quelle
18
Mit anderen Worten, um zu drucken --, können Sie ausführen printf -- --.
l0b0
2
... und printf --ist dasselbe wie printf(Sie erhalten die gleiche Nachricht)
Peter.O
25

-- wird als eine Option interpretiert (in diesem Fall, um anzuzeigen, dass es keine weiteren Optionen gibt).

Bei der Verwendung sollte immer eine Formatzeichenfolge angegeben werden printf, um eine falsche Interpretation zu vermeiden. Für Ihren speziellen Fall:

printf '%s\n' '-----------------------'
Chris Down
quelle
Was ist, wenn Sie dies mit einer Sequenz tun müssen? printf '-%.0s' {1..54}
Qodeninja
2
@qodeninja Dann sind Sie eigentlich tun verwenden wollen --:-)printf -- '-%.0s' {1..54}
Chris Ab
4

Es gibt Unterschiede zwischen printf builtin und / usr / bin / printf, der zweite macht "was du meinst" ohne diese lästigen Fehler.

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