Escaping special Shell characters in `showcmd()`.
Continuation of issue https://github.com/Etersoft/eepm/issues/507.
Such escaping should work on all POSIX Shells. With Bash extensions, one can create much more simple solution, like this:
# Print command line and run command line
docmd()
{
showcmd "$(echo $* | xargs -n1 printf '%q ' | sed -e 's/ $//1')$EXTRA_SHOWDOCMD"
"$@"
}
Зачем нужно что-то экранировать?
Зачем нужно что-то экранировать?
EEPM выводит неверную информацию при попытке поиска по регулярным выражениям. Так, например, epms "media|video" player печатает строку, которая передаёт вывод apt-cache search -- media в несуществующую команду video:
apt-cache search -- media|video | grep -E -i -- "media|video" | grep -E -i -- "player" | grep -E -i --color -- "(media|video|player)"
Подробнее см. #507. Регулярными выражениями пользуюсь часто, поэтому казалось естественным использовать их и в EEPM.
Вопреки теме MR, исправляется не функция showcmd. Написано, что экранируются специальные символы, а на деле экранируется всё, кроме. Также всё это слишком громоздко выглядит.
Вопреки теме MR, исправляется не функция showcmd.
Да, действительно, проглядел, что уже не ту функцию правлю. В showcmd() на момент получения входной строки ничего сделать нельзя — все аргументы в docmd() уже оказываются слеплены в один большой аргумент.
Написано, что экранируются специальные символы, а на деле экранируется всё, кроме.
Мне кажется, вот так оно выглядит куда хуже:
case "$INPUT" in
*[\`\!\$\^\&\*\(\)\{\}\|\[\]\\\;\'\",\<\>?\#]*)
# Escape args containing special characters.
Также всё это слишком громоздко выглядит.
Как говорил, это необходимо, если придерживаться стандартов совместимости POSIX. Если ограничиться конкретной оболочкой — можно ужать до одной строки.
Впрочем, можно сделать три вещи:
- Убрать перестраховку "
[ -z "$INPUT" ] && echo "''" && return", так как пустой аргумент теоретически передаться в текущей системе не может. - Удалить обработку обратных слэшей, так как в EEPM-запрос их вставить не удаётся, они где-то по пути до
docmd()обязательно теряются. Но вотapt-cache search -- '\\'работает исправно, так что, возможно, позже нужно будет в выражение экранирования вернуть. - Поправить основную экранирующую последовательность. Заметил, что почти во всём проекте в качестве разделителя используется не более классический '
/', а '|' (предполагаю, потому, что часто идёт работа с путями) — так что заметил на него.
echon "$INPUT" | sed -e "s|'|'\"'\"'|g" -e "s|.\+|'&' |g"
В целом всё то же самое: сначала экранируются одинарные кавычки, затем вход оборачивается в них же. Но на этой неделе я случайно узнал про символ '&' в sed, так что последнее выражение стало чуть короче.