Экранирование обратной кавычки в строке в двойных кавычках в оболочке - PullRequest
28 голосов
/ 01 декабря 2009

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

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

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

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

Ответы [ 3 ]

44 голосов
/ 22 февраля 2010

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

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

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

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

$ /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 `.

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

4 голосов
/ 22 февраля 2010

Вместо этого используйте одинарные кавычки:

/usr/bin/sh -c 'ls 1\`'
0 голосов
/ 22 февраля 2010
 /usr/bin/sh -c "ls '1\`'"
...