Spec-Zone.ru › Elisp

Аргументы командной оболочки

Программы на языке 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API