Экранирование \ e в кавычках 'или' (одинарные или двойные) с printf в bash - PullRequest
0 голосов
/ 25 октября 2018

Я нахожусь в процессе написания сценария оболочки, который настраивает мой компьютер osx точно так, как мне нравится каждый раз, когда я получаю новый компьютер.Один кусочек сахара командной строки, который мне действительно нравится, это поиск по истории bash .Как говорится в посте ask ubuntu, добавление строки:

bind '"\e[A":history-search-backward'

к моему ~/.bashrc сделает это для меня, но я бы хотел, чтобы это автоматизировалось из моего сценария ...

Для достижения этого у меня был наибольший успех с printf, но мне нужно экранировать кавычки и escape-последовательность сразу после bind ('"\e), что-то вроде:

printf "bind \'\"\\e[A\":history-search-backward\'" >> ~/.bashrc

, но в этом примереescape-последовательность не экранируется, поэтому в моем ~/.bashrc я получаю строку:

bind '"^[[A":history-search-backward'

Я пробовал множество различных комбинаций цитирования / экранирования / интерполяции и имел небольшой успех, у кого-нибудь есть экранирование некоторых символовfoo, который может добиться этого или даже просто объяснение того, почему это не сработает, Google особенно остро стоит перед этим, особенно во время побега \e.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Цитируемый здесь документ - самый простой способ сделать это (как в комментарии другого парня и в ответе Бармара), но если вы действительно хотите использовать printf, есть несколько способов сделать это.Прежде чем перейти к основной проблеме, есть две вспомогательные: вам не нужно экранировать одинарные кавычки в строке, и вам do необходимо добавить символ новой строки (\n) вend (в отличие от echo, printf не добавляет это автоматически).

Большая проблема с вашей текущей командой состоит в том, что вы помещаете нужную строку в первый аргумент printf,который он обрабатывает как строку формата - среди прочего, это означает, что он интерпретирует escape-последовательности в нем.После того, как оболочка уже интерпретировала их.Поскольку существует две фазы интерпретации escape, вам нужно в четыре раза увеличить escape , в которой вы хотите оказаться в финальной строке:

printf "bind '\"\\\\e[A\":history-search-backward'\n"

Альтернативно, вы можете поместить строку во вторую строкуаргумент printf и использовать строку формата, которая буквально включает его (директива %s) без дополнительный уровень интерпретации escape:

printf '%s\n' "bind '\"\\e[A\":history-search-backward'"

Обратите внимание, что \n должен быть в строке формата, поэтому он переводится на фактическую новую строку.

Или вы можете просто использовать цитируемый здесь документ.

0 голосов
/ 25 октября 2018

Используйте здесь-документ:

cat <<'EOF' >>~/.bashrc
bind '"\e[A":history-search-backward'
EOF

Кавычки вокруг EOF означают, что содержимое здесь-документа будет обрабатываться как строка в одинарных кавычках, поэтому $ будет обрабатыватьсябуквально, а не как префикс переменной.Это не имеет значения в этой конкретной строке, но может в более общих приложениях.

...