Escape backquote в строке с двойными кавычками в оболочке

Для команды:/usr/bin/sh -c "ls 1`" (обратная кавычка после 1).

Как сделать его успешным? Добавление обратной косой черты перед "`" не работает. `является специальным char, как мы знаем, и я попытался окружить его одинарной цитатой (/usr/bin/sh -c "ls 1'` '" ), но это тоже не работает.

Ошибка всегда:

% /usr/bin/sh -c "ls 1\`"
Unmatched `

Ответы

Ответ 1

Вам нужно избегать обратного хода, но также избежать обратной косой черты:

$ touch 1\`
$ /bin/sh -c "ls 1\\\`"
1`

Причина, по которой вам нужно избегать "дважды", заключается в том, что вы вводите эту команду в среду (например, оболочку script), которая интерпретирует строку с двумя кавычками один раз. Затем он снова интерпретируется подоболочкой.

Вы также можете избежать двойных кавычек и, таким образом, избегать первой интерпретации:

$ /bin/sh -c 'ls 1\`'
1`

Другой способ - сохранить имя файла в переменной и использовать это значение:

$ export F='1`'
$ printenv F
1`
$ /bin/sh -c 'ls $F'  # note that /bin/sh interprets $F, not my current shell
1`

И, наконец, то, что вы пробовали, будет работать на некоторых оболочках (я использую bash, как в приведенных выше примерах), по-видимому, не с вашей оболочкой:

$ /bin/sh -c "ls 1'\`'"
1`
$ csh  # enter csh, the next line is executed in that environment
% /bin/sh -c "ls 1'\`'"
Unmatched `.

Я настоятельно рекомендую вам избегать таких имен файлов в первом месте.

Ответ 2

/usr/bin/sh -c 'ls 1\`'

Ответ 3

 /usr/bin/sh -c "ls '1\`'"