L'exécution d'une commande shell à partir de Common Lisp
Comment puis-je exécuter un shell (bash) de commande à l'intérieur d'un Common Lisp programme et affecter la sortie d'une variable?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je exécuter un shell (bash) de commande à l'intérieur d'un Common Lisp programme et affecter la sortie d'une variable?
Vous devez vous connecter pour publier un commentaire.
ASDF fournit un
RUN-SHELL-COMMAND
qui travaille avec de nombreux Common Lisp implémentations y compris ABCL, Allegro CL, CLISP, Clozure CL, ECL, GCL, LispWorks, SBCL, CMU, XCL et SCL.Il prend une chaîne de contrôle et une liste d'arguments comme
FORMAT
, et de manière synchrone, exécute le résultat à l'aide d'un Bourne-compatible coque. Sortie de Capture par la liaison facultative flux.run-shell-command
: "Cette fonction est obsolète et présente uniquement pour des raisons de compatibilité ascendante: “Si ce n'est pas à l'envers, il n'est pas compatible”. Nous vous déconseillons fortement de son utilisation. Son comportement actuel n'est bien défini sur les plates-formes Unix (qui comprennent MacOS X et cygwin). Sur Windows, tout y passe. La documentation suivante est seulement pour le but de votre migration loin d'elle d'une manière qui préserve la sémantique."run-program
de la documentation ici simples et des exemples d'utilisation here.run-program
(sync) etlaunch-program
(async).run-shell-command
. C'est seulement considéré déconseillée car il ne fonctionne pas sur Windows.ITA a publié inférieure de la coquille de sous leur QITAB parapluie projet.
Quelques liens d'intérêt possibles :
Un dépôt git est actuellement hébergé à l'common-lisp.net :
:inferior-shell
est installable par lesquicklisp
.run-program
(qui est synchrone, lancez-programme asynchrone).Vous pouvez envisager d'utiliser des Trivial-shell (url)
de commande shell retourne de sortie, de sorte que vous pouvez l'affecter à une variable.
Dans asdf.lisp fichier, vous pouvez lire:
Certains CL implémentations ont des fonctions intégrées à cette fin. Par exemple, SBCL a
sb-ext:run-program
, et le CCL arun-program
.Aujourd'hui, je voudrais utiliser
uiop:run-program
, oùuiop
signifie "universel d'entrée et de sortie" et est une couche de compatibilité fournis par asdf3, anciennement connu sous leasdf/driver
. Comme il a été ditasdf:run-shell-command
est obsolète et uiop hérite de nombreuses fonctionnalités d'autres bibliothèques commetrivial-shell
.UIOP readme
Dans sbcl:
Il fonctionne très bien pour moi:)
Ce (appupdate.cl) est un exemple de la création et de l'exécution d'un script shell en utilisant l'Acier de la Banque Common Lisp (sbcl) la mise en œuvre, ce qui suppose que vous avez sbcl installé et le son dans votre chemin.
J'ai écrit cela sur Ubuntu 14.04 comme un simple moyen de réaliser l'automatisation de la mise à jour, mise à niveau, et le noyau de la mise à niveau de l'application/logiciel système.
Alors bien sûr, il crée un script shell droit update.sh qui est dirigée vers /bin/bash via shebang (#!). Après avoir fait de sorte que le sb-ext:exécution du programme intégré dirige un shell pour exécuter /bin/chmod en passant le drapeau "+x" comme argument et le /chemin/vers/le-fichier. Cette fonction change le mode d'accès du fichier exécutable (modifie les permissions).
Prochain, un shell est ouvert et exécute /bin/bash et le bash binaire est passé à l'argument de l'exécutable shell scripts de l'emplacement du fichier.
Enfin, le fichier est supprimé à partir du répertoire de travail (dans ce cas, le appupdate.la cl est dans mon répertoire home est le répertoire de travail).
La appupdate.cl fichier peut être exécuté depuis la ligne de commande après il est changé à l'exécutable et temporaire des privilèges root sont acquises:
Assez facilement la commande sudo pourraient être ajoutées dans le script (par exemple, la commande sudo apt-get update) et à l'aide de la commande sudo bash séquence ne serait pas nécessaire.
REMARQUE: Dans le LispWorks ide sur la 14.04 (sys:exécution de commande shell ""), toujours en vigueur, même si elle a une sorte de devenir un "héritage" de la fonction.
J'ai essayé quelques réponses mais il n'a pas été simple.
C'est ce qui a fonctionné facilement:
C'est de l'ide, Weitz du livre
Common Lisp Recipes
qui appartient à la débarrasser de toute programmeur Lisp, de mon point de vue...