Почему printf не экранирует символы новой строки?

Вот расширенный пример с использованием метода send-keys, рекомендованного @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
6
30.01.2020, 22:30
2 ответа

Это не имеет ничего общего с printf, а имеет отношение только к аргументу, который вы привелиprintf.

В строке -в двойных кавычках оболочка превращает \\в \. Таким образом, аргумент, который вы дали printf, на самом деле является hi\n, который, конечно, printfзатем выполняет свою собственную обработку управляющей последовательности.

В строке, заключенной в двойные -кавычки, экранирование, выполняемое оболочкой через \, специально ограничено воздействием на символы & #x240a;, \, `, $и ". ] персонажи. Вы обнаружите, что \nпередается в printf, как и -. Таким образом, аргумент, который вы дали printf, на самом делеhi\nснова .

Будьте осторожны, помещая escape-последовательности в строку формата для printf. Только некоторые имеют определенные значения в Единой Спецификации Unix . \nопределяется,но \cна самом деле нет, например.

Дополнительная литература

32
28.04.2021, 23:25

В двойных кавычках \\n— это экранированная (обратная косая черта )в кавычках, за которой следует n. Это дается printf, так как \nи printfвыводят новую строку.

В двойных кавычках (по-прежнему ), \n— это строка \n. Опять же, printfполучает строку \nи печатает новую строку.

В двойных кавычках обратная косая черта является специальной только перед другой обратной косой чертой, новой строкой или любым из $, `или ". «Особый» означает, что он удаляет специальное значение следующего символа. Если обратная косая черта предшествует любому другому символу (n, например ), то это просто обратная косая черта.

Это объясняется в стандарте POSIX .

Чтобы напечатать \nв строке формата printf, используйте printf '\\n'или printf "\\\\n"или используйте printf '%s' '\n'

.

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

printf 'This is how you write a newline: %s\n' '\n'
15
28.04.2021, 23:25

Теги

Похожие вопросы