Выполнение команды оболочки из Common Lisp

Зависит от базы данных, поскольку каждая база данных имеет различный способ добавить порядковые номера. Я изменил бы таблицу, чтобы добавить, что столбец тогда пишет сценарий дб в отличном/Python/и т.д., чтобы читать в данных и обновить идентификатор с последовательностью. Как только данные были установлены, я добавлю последовательность к таблице, которая запускается после главного числа. Как только данные были установлены, устанавливал первичные ключи правильно.

23
задан Terje Norderhaug 20 May 2011 в 01:12
поделиться

7 ответов

ASDF предоставляет RUN-SHELL-COMMAND, который работает со многими реализациями Common Lisp , включая ABCL, Allegro CL, CLISP, Clozure CL, ECL, GCL, LispWorks, SBCL, CMU, XCL и SCL.

Он принимает управляющую строку и список аргументов, например FORMAT, и синхронно выполняет результат, используя Bourne-совместимую оболочку. Захватите выход, связав дополнительный поток.

12
ответ дан 29 November 2019 в 01:34
поделиться

ITA выпустила нижнюю оболочку в рамках своего зонтичного проекта QITAB.

Некоторые ссылки могут представлять интерес:

Репозиторий git в настоящее время размещен на common-lisp.net:

git clone git://common-lisp.net/projects/qitab/inferior-shell.git
12
ответ дан 29 November 2019 в 01:34
поделиться

Вы можете использовать Trivial-shell ( url )

(trivial-shell:shell-command "echo foo")

команда оболочки возвращает результат, поэтому вы можете присвоить его переменной.

В файле asdf.lisp вы можете прочитать:

;;;; Вероятно, нам следует перенести эту функциональность в собственную систему и отказаться от нее

;;;; использование его из пакета asdf. Тем не менее, это будет нарушено не указано

;;;; существующее программное обеспечение, поэтому пока не существует четкой альтернативы, мы не можем осудить

;;;; это, и даже после того, как это устарело, мы будем поддерживать его в течение нескольких

;;;; лет, так что у всех есть время, чтобы уйти от этого. - тариф 2009-12-01

8
ответ дан 29 November 2019 в 01:34
поделиться

В настоящее время я бы использовал uiop:run-program, где uiop означает «универсальный ввод-вывод» и представляет собой слой совместимости, предоставляемый asdf3, ранее известный как asdf/driver. Как уже было сказано, asdf:run-shell-command устарел, и uiop наследует многие особенности других библиотек, таких как trivial-shell.

UIOP readme

6
ответ дан 29 November 2019 в 01:34
поделиться

Некоторые реализации CL имеют встроенные функции для этой цели. Например, SBCL имеет sb-ext:run-program, а CCL имеет run-program.

5
ответ дан 29 November 2019 в 01:34
поделиться

В sbcl:

(sb-ext:run-program "/bin/sh" (list "-c" "whoami") :input nil :output *standard-output*)

Это прекрасно работает для меня:)

4
ответ дан 29 November 2019 в 01:34
поделиться

Эта (appupdate.cl) программа является примером создания и выполнения сценария оболочки с использованием реализации Steel Bank Common Lisp (sbcl), которая предполагает, что у вас установлен sbcl и он находится на вашем пути.

Я написал это в Ubuntu 14.04 как простой способ автоматизировать обновление, обновление и обновление ядра приложения / системного программного обеспечения.

#!/usr/local/bin/sbcl --script
(with-open-file (str "/home/geo/update.sh"
                     :direction :output
                     :if-exists :supersede
                     :if-does-not-exist :create)
  (format str "#! /bin/bash~%~%apt-get update~%~%apt-get upgrade -y~%~%apt-get dist-upgrade -y~%~%exit~%))
(sb-ext:run-program "/bin/chmod" '("+x" "/home/geo/update.sh")
    :output *standard-output*)
(sb-ext:run-program "/bin/bash" '("/home/geo/update.sh")
    :output *standard-output*)
(sb-ext:run-program "/bin/rm" '("-rf" "/home/geo/update.sh")
    :output *standard-output*)

Поэтому, конечно, он создает скрипт оболочки с именем update.sh, который направляется в / bin / bash через shebang (#!). После этого встроенная sb-ext: run-program направляет оболочку для выполнения / bin / chmod, передавая флаг "+ x" в качестве аргумента и / path / to / the-file. Эта функция изменяет режим доступа файла к исполняемому файлу (изменяет права доступа).

Затем оболочка открыта и выполняет / bin / bash, а двоичному файлу bash передается аргумент местоположения файла исполняемых сценариев оболочки.

Наконец, файл удаляется из рабочего каталога (обратите внимание, что в этом случае appupdate.cl находится в моем домашнем каталоге, поэтому это рабочий каталог).

Файл appupdate.cl может быть выполнен из командной строки после его изменения на исполняемый и получения временных привилегий root:

:~$ chmod +x appupdate.cl

:~$ sudo bash

:~# ./appupdate.cl

:~# exit

Достаточно легко добавить команду sudo в скрипт (например, sudo apt-get update) и использование последовательности sudo bash не требуется.

ПРИМЕЧАНИЕ. В LispWorks ide 14.04 (sys: run-shell-command "") по-прежнему применимо, даже если оно в некотором роде стало унаследованной функцией.

2
ответ дан 29 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: