Escaping special Shell characters in showcmd().#517
Escaping special Shell characters in showcmd().#517eteryear wants to merge 1 commit intoEtersoft:develfrom
showcmd().#517Conversation
Should work on all POSIX Shells.
| [ -z "$INPUT" ] && echo "''" && return | ||
|
|
||
| case "$INPUT" in | ||
| *[!0-9A-Za-z_.-]*) |
There was a problem hiding this comment.
Сомневаюсь, что экранировать надо всё кроме перечисленных символов. Наверняка есть перечень символов, которые являются служебными и которые надо экранировать.
There was a problem hiding this comment.
Да, можно смотреть по грамматике — сначала так и сделал, но затем обнаружил, что упустил один символ. Поэтому для гарантии безопасности предпочёл экранировать "всё, кроме".
|
Зачем нужно что-то экранировать? |
EEPM выводит неверную информацию при попытке поиска по регулярным выражениям. Так, например, apt-cache search -- media|video | grep -E -i -- "media|video" | grep -E -i -- "player" | grep -E -i --color -- "(media|video|player)"Подробнее см. #507. Регулярными выражениями пользуюсь часто, поэтому казалось естественным использовать их и в EEPM. |
0cf2e3e to
2c34939
Compare
|
Вопреки теме MR, исправляется не функция showcmd. |
Да, действительно, проглядел, что уже не ту функцию правлю. В
Мне кажется, вот так оно выглядит куда хуже: case "$INPUT" in
*[\`\!\$\^\&\*\(\)\{\}\|\[\]\\\;\'\",\<\>?\#]*)
# Escape args containing special characters.
Как говорил, это необходимо, если придерживаться стандартов совместимости POSIX. Если ограничиться конкретной оболочкой — можно ужать до одной строки. Впрочем, можно сделать три вещи:
echon "$INPUT" | sed -e "s|'|'\"'\"'|g" -e "s|.\+|'&' |g"В целом всё то же самое: сначала экранируются одинарные кавычки, затем вход оборачивается в них же. Но на этой неделе я случайно узнал про символ ' |
3779091 to
fe91d08
Compare
|
Так исправлять в соответствии с #517 (comment) или закрывать ветку, и пусть отображается неэкранированная команда? |
784181c to
6a4c9ac
Compare
Continuation of issue #507.
Such escaping should work on all POSIX Shells. With Bash extensions, one can create much more simple solution, like this: