Каковы все возможные символы пути Linux, которые нужно экранировать - PullRequest
1 голос
/ 05 ноября 2010

Мне интересно, для чего нужны все символы, необходимые для пути linux. Например, путь / home / user1 / My Music / song 1.mp3 должен быть экранирован в оболочке для команды ls 'ls / home / user1 / My \ Music / song \ 1.mp3'.

Я хочу написать функцию, которая принимает строку в качестве пути и экранирует все необходимые символы. В скале у меня есть:

  def normalizePath(path: String): String = {
var normPath = path.replaceAll(" ", "\\\\ ")
normPath = normPath.replaceAll("\\]", "\\\\]")
normPath = normPath.replaceAll("\\[", "\\\\[")

normPath

}

Зная, что есть еще один символ, который нужно убежать. Кроме того, это может быть сделано одной командой (более сложное регулярное выражение)?

Ответы [ 3 ]

7 голосов
/ 05 ноября 2010

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

ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3");
proc.start();
2 голосов
/ 05 ноября 2010

Я думаю, что проще заключать в кавычки строки, чем избегать их. Алгоритм одинарной кавычки:

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

Так что это довольно легко.

Однако мне нравится ответ ProcessBuilder, который будет еще проще, если он у вас работает.

Полное исключение оболочки - это одновременно и производительность, и выигрыш в безопасности, если вам не нужны какие-либо функции оболочки и вы просто хотите запустить процесс.

Если вы хотите использовать экранирование, я бы предложил использовать белый список вместо символов черного списка. то есть избегать всего, что не является [a-zA-Z0-9_] или чего-то еще. Любой символ может быть экранирован, кроме новой строки. Обратная косая черта с последующим переводом строки означает «удалить как обратную косую черту, так и перевод строки» - если за пределами кавычек. В двойных кавычках, я думаю, вы можете избежать новой строки с обратной косой чертой, а затем новой строки. Внутри одинарных кавычек я не думаю, что вы должны (или можете) экранировать новую строку, просто добавьте символ новой строки.

Хорошим справочником является спецификация UNIX98 для "Shell Command Language" http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

0 голосов
/ 05 ноября 2010

Одинарные кавычки препятствуют расширению оболочки, поэтому все, что вам нужно, это:

def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...