Skip to content

Conversation

@eteryear
Copy link
Contributor

Continuation of issue #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"
    "$@"
}

Should work on all POSIX Shells.
@vitlav vitlav assigned vitlav and Boria138 and unassigned vitlav Oct 29, 2025
[ -z "$INPUT" ] && echo "''" && return

case "$INPUT" in
*[!0-9A-Za-z_.-]*)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сомневаюсь, что экранировать надо всё кроме перечисленных символов. Наверняка есть перечень символов, которые являются служебными и которые надо экранировать.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, можно смотреть по грамматике — сначала так и сделал, но затем обнаружил, что упустил один символ. Поэтому для гарантии безопасности предпочёл экранировать "всё, кроме".

@vitlav
Copy link
Collaborator

vitlav commented Nov 3, 2025

Зачем нужно что-то экранировать?

@eteryear
Copy link
Contributor Author

eteryear commented Nov 5, 2025

Зачем нужно что-то экранировать?

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.

@vitlav vitlav force-pushed the devel branch 3 times, most recently from 0cf2e3e to 2c34939 Compare November 7, 2025 08:26
@vitlav
Copy link
Collaborator

vitlav commented Nov 12, 2025

Вопреки теме MR, исправляется не функция showcmd.
Написано, что экранируются специальные символы, а на деле экранируется всё, кроме.
Также всё это слишком громоздко выглядит.

@eteryear
Copy link
Contributor Author

Вопреки теме MR, исправляется не функция showcmd.

Да, действительно, проглядел, что уже не ту функцию правлю. В showcmd() на момент получения входной строки ничего сделать нельзя — все аргументы в docmd() уже оказываются слеплены в один большой аргумент.

Написано, что экранируются специальные символы, а на деле экранируется всё, кроме.

Мне кажется, вот так оно выглядит куда хуже:

case "$INPUT" in
    *[\`\!\$\^\&\*\(\)\{\}\|\[\]\\\;\'\",\<\>?\#]*)
        # Escape args containing special characters.

Также всё это слишком громоздко выглядит.

Как говорил, это необходимо, если придерживаться стандартов совместимости POSIX. Если ограничиться конкретной оболочкой — можно ужать до одной строки.

Впрочем, можно сделать три вещи:

  1. Убрать перестраховку "[ -z "$INPUT" ] && echo "''" && return", так как пустой аргумент теоретически передаться в текущей системе не может.
  2. Удалить обработку обратных слэшей, так как в EEPM-запрос их вставить не удаётся, они где-то по пути до docmd() обязательно теряются. Но вот apt-cache search -- '\\' работает исправно, так что, возможно, позже нужно будет в выражение экранирования вернуть.
  3. Поправить основную экранирующую последовательность. Заметил, что почти во всём проекте в качестве разделителя используется не более классический '/', а '|' (предполагаю, потому, что часто идёт работа с путями) — так что заметил на него.
echon "$INPUT" | sed  -e "s|'|'\"'\"'|g"  -e "s|.\+|'&' |g"

В целом всё то же самое: сначала экранируются одинарные кавычки, затем вход оборачивается в них же. Но на этой неделе я случайно узнал про символ '&' в sed, так что последнее выражение стало чуть короче.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants