У меня есть несколько переменных Bash для цветов терминала ANSI. Один из них - ANSI_NOCOLOR
и определяется следующим образом:
ANSI_NOCOLOR="\e[0m"
Когда я использую его вместе с символом обратной косой черты \
(экранированный как \\
в строках Bash), я получаю неожиданный вывод.
Пример:
echo -e "command --with --many --options \\$ANSI_NOCOLOR"
echo -e "--more --options"
В результате:
command --with --many --options \e[0m
--more --options
Этот пример может быть уменьшен до:
$ echo -e "\\\e[0m"
\e[0m
Почему тройная обратная косая черта в Bash не работает так, как обычно известно из других C-подобных языков?
Ожидаемое / C-подобное поведение:
Escape-последовательности левоассоциативны. Таким образом,
- первые два
\\
печатаются как \
,
- оставшиеся
\
делают предварительный просмотр (1), чтобы найти e
для создания символа ESC
.
Обход:
После некоторого строгания с обратными слешами я обнаружил, что 5 !! обратная косая черта обязательна. Я все еще хотел бы прочитать объяснение, почему оно ведет себя так, как оно есть.
$ echo -e "\\\\\e[33mfoo\e[0m"
\foo
Сложно управлять последовательностью сброса цвета, поэтому мой обходной путь использует две escape-последовательности ANSI, чтобы установить желтый цвет и вернуться к значению по умолчанию.