Аргументы командной оболочки
Программы на языке Lisp иногда нуждаются в запуске командной оболочки и передаче ей команды, содержащей имена файлов, указанные пользователем. Эти программы должны поддерживать любые допустимые имена файлов. Но оболочка обрабатывает некоторые символы особым образом, и если эти символы встречаются в имени файла, они могут вызвать проблемы. Для обработки этих символов используйте функцию shell-quote-argument:
- Функция: shell-quote-argument аргумент
-
Эта функция возвращает строку, представляющую аргумент, содержимое которого равно аргумент, в синтаксисе командной оболочки. Она должна надежно конкатенировать возвращаемое значение в командную строку оболочки и передавать её оболочке для выполнения.
Точное поведение этой функции зависит от вашей операционной системы. Функция предназначена для работы с синтаксисом стандартной оболочки вашей системы; если вы используете необычную оболочку, вам нужно будет переопределить эту функцию. См. Рекомендации по безопасности.
;; This example shows the behavior on GNU and Unix systems. (shell-quote-argument "foo > bar") ⇒ "foo\\ \\>\\ bar" ;; This example shows the behavior on MS-DOS and MS-Windows. (shell-quote-argument "foo > bar") ⇒ "\"foo > bar\""
Вот пример использования
shell-quote-argumentдля построения команды оболочки:(concat "diff -u " (shell-quote-argument oldfile) " " (shell-quote-argument newfile))
Следующие две функции полезны для объединения списка отдельных строк аргументов командной строки в одну строку и разбиения строки на список отдельных аргументов командной строки. Эти функции в основном предназначены для преобразования пользовательского ввода в минибуфере, строки Lisp, в список строковых аргументов, которые будут переданы make-process, call-process или start-process, или для преобразования таких списков аргументов в одну строку Lisp для отображения в минибуфере или области вывода. Обратите внимание, что если используется оболочка (например, при использовании call-process-shell-command), аргументы всё равно должны быть защищены с помощью shell-quote-argument; combine-and-quote-strings не предназначен для защиты специальных символов от интерпретации оболочкой.
- Функция: split-string-shell-command строка
-
Эта функция разбивает строку на подстроки, учитывая двойные и одинарные кавычки, а также обратные слэши для экранирования.
(split-string-shell-command "ls /tmp/'foo bar'") ⇒ ("ls" "/tmp/foo bar")
- Функция: split-string-and-unquote строка &optional разделители
-
Эта функция разбивает строку на подстроки по совпадениям с регулярным выражением разделители, как это делает
split-string(см. Создание строк); кроме того, она удаляет экранирование из подстрок. Затем она формирует список подстрок и возвращает его.Если разделители опущены или
nil, они по умолчанию устанавливаются в"\\s-+", что является регулярным выражением, которое соответствует одной или нескольким символам с использованием синтаксиса пробелов (см. Таблица классов синтаксиса).Эта функция поддерживает два типа экранирования: заключение всей строки в двойные кавычки
"…", и экранирование отдельных символов с помощью обратного слэша '\'. Последний также используется в строках Lisp, поэтому эта функция может обрабатывать и их.
- Функция: combine-and-quote-strings список-строк &optional разделитель
-
Эта функция конкатенирует список-строк в одну строку, экранируя каждую строку при необходимости. Она также вставляет разделитель между каждой парой строк; если разделитель опущен или
nil, он по умолчанию устанавливается в" ". Возвращаемое значение — результирующая строка.Строки в список-строк, которые требуют экранирования, это те, которые включают разделитель в качестве своей подстроки. Экранирование строки заключается в двойные кавычки
"…". В самом простом случае, если вы создаёте команду из отдельных аргументов командной строки, каждый аргумент, содержащий вставленные пробелы, будет экранирован.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Shell-Arguments.html