Черточки в принтф

37

Я пытаюсь использовать printf для форматирования довольно симпатичного вывода в скрипте bash

например:
-----------------------
| This is some output |
-----------------------

Но я наткнулся на какое-то поведение, которое я не понимаю.

$ printf "--" дает мне ошибку printf: usage: printf [-v var] format [arguments]

и $ printf "-stuff"приводит к-bash: printf: -s: invalid option

Так что, очевидно, printf думает, что я пытаюсь передать некоторые аргументы, а я нет.

Между тем, совершенно случайно, я нашел этот обходной путь:
$ printf -- "--- this works now ----\n"дает мне--- this works now ----

Кто-нибудь может объяснить это поведение?

Кенни Рассчарт
источник
1
См. Также unix.stackexchange.com/questions/11376/…
manatwork
Есть ли какие-либо реализации echo, которые потерпят неудачу при выполнении echo ------------? Большинство из них только поддерживают -n(без завершающего символа новой строки), -e(интерпретируют символы с обратной косой чертой) и возможны -E(НЕ интерпретируют их) и не выдают ошибку при обнаружении других аргументов, подобных опции, верно? (РЕДАКТИРОВАТЬ: GNU /bin/echoтакже поддерживает --helpи --version.)
Janmoesen

Ответы:

44

--Используется , чтобы сообщить программе , что все , что следует должны не быть интерпретированы как в командной строке опции к printf.

Изменить: Таким образом, printf "--"вы пытались в основном как «printf без аргументов» и, следовательно, не удалось.

Sr-
источник
19
Другими словами, для печати --вы можете запустить printf -- --.
10
2
... и так printf --же, как printf(вы получаете то же сообщение)
Peter.O
Обратите внимание, что printf -- $fmtэто не портативный. На busybox 1.30.1 printf -- '%s\n' helloуступает --. Смотрите также: pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
Кельвин
25

-- интерпретируется как опция (в данном случае, чтобы показать, что больше нет опций).

Строка формата всегда должна быть включена при использовании, printfчтобы предотвратить неверную интерпретацию. Для вашего конкретного случая:

printf '%s\n' '-----------------------'
Крис Даун
источник
что делать, когда вам нужно сделать это с последовательностью? printf '-%.0s' {1..54}
qodeninja
2
@qodeninja Тогда вы на самом деле сделать хотите использовать --:-)printf -- '-%.0s' {1..54}
Chris Вниз
4

Есть различия между встроенной функцией printf и / usr / bin / printf, вторая делает «то, что вы имеете в виду» без этих досадных ошибок.

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
BOC
источник