2010-12-11 27 views
8

Ce que je voudrais avoir est un mécanisme que toutes les commandes que j'entre dans un Bash-Terminal soient enveloppées par un script Python. Le script Python exécute la commande entrée, mais ajoute de la magie supplémentaire (par exemple en définissant des variables d'environnement "dynamiques"). Est-ce possible?Enveloppez toutes les commandes entrées dans un Bash-Shell avec un script Python

Je cours Ubuntu et Debian Squeezy.

explication supplémentaire:

J'ai un bien-file qui change dynamiquement (certains scripts ne modifient à tout moment). J'ai besoin des propriétés de ce fichier comme variables d'environnement dans tous mes scripts shell. Bien sûr, je pourrais analyser le fichier de propriétés d'une manière ou d'une autre, mais je préfère utiliser un style orienté objet pour cela (en particulier pour l'écriture), comme cela peut être fait avec Python (et ConfigObject).

Par conséquent je veux emballer tous mes manuscrits avec ce manuscrit de Python (sans devoir modifier les manuscrits eux-mêmes) qui manipule ces propriétés jusqu'à tous les manuscrits de Shell. Ceci est mon cas d'utilisation actuel, mais je peux imaginer que je vais trouver des cas supplémentaires auxquels je peux prolonger mon emballage plus tard.

+0

Pourriez-vous élaborer davantage sur ce que vous voulez faire? Comment allez-vous emballer les commandes shell et comment allez-vous les exécuter? Cela peut se faire en deux (ou peut-être plus): a) gérer la commande comme une chaîne, ajouter quelque chose à cette chaîne et lancer cette chaîne dans bash; b) obtenir la commande, exécuter le bash en utilisant 'subprocess' ou autre chose et passer la commande (précédée d'une autre commande). – khachik

Répondre

11

Le moyen idéal pour emballer chaque commande tapée dans un shell Bash est de changer la variable PROMPT_COMMAND à l'intérieur du .bashrc. Par exemple, si je veux faire des trucs de Python avant chaque commande, n'a pas aimé demandé à ma question:

.bashrc:

# ... 
PROMPT_COMMAND="python mycoolscript.py; $PROMPT_COMMAND;" 
export $PROMPT_COMMAND 
# ... 

maintenant avant chaque commande que le script mycoolscript.py est exécuté.

0

Je ne sais pas de quoi que ce soit, mais deux choses qui pourraient vous aider à suivre

  1. http://sourceforge.net/projects/pyshint/
  2. La coquille ipython a une fonctionnalité pour exécuter des commandes shell dans le iterpreter.
+1

Ouais je sais ipython mais je veux aussi py-ify mon shell standard;) – ifischer

1

Utilisez le trap DEBUG de Bash. Faites-moi savoir si vous avez besoin de moi pour élaborer.

Edit:

Voici un exemple simple des types de choses que vous pourriez être en mesure de le faire:

$ cat prefix.py 
#!/usr/bin/env python 
print "export prop1=foobar" 
print "export prop2=bazinga" 
$ cat propscript 
#!/bin/bash 
echo $prop1 
echo $prop2 
$ trap 'eval "$(prefix.py)"' DEBUG 
$ ./propscript 
foobar 
bazinga 

Vous devez être conscient de la security risks of using eval.

+0

J'ai lu quelques trucs sur le piège de débogage, mais je ne pouvais pas trouver comment l'utiliser pour mon "problème" – ifischer

+0

@ifischer: Votre python Le script peut influencer l'environnement d'un shell enfant, mais il ne peut pas influencer l'environnement du shell en cours. Vous aurez besoin de faire votre traitement dans Bash en utilisant le piège DEBUG (éventuellement avec Python en train de faire un traitement et de sortir le résultat en tant que chaîne pour que Bash puisse s'appliquer d'une façon ou d'une autre) ou utiliser un wrapper comme vous l'avez fait. Si vous publiez des détails plus précis sur ce que vous essayez d'accomplir, je peux vous aider davantage ou vous diriger vers une méthode différente à utiliser. –

+0

C'est correct que les variables ne soient pas influencées dans le shell actuel, tant que je lance chaque commando avec mon x-script. Donc je suis assez satisfait de ma solution, sauf que je dois taper x avant chaque commande (mais cela a aussi des avantages si je veux exécuter des scripts sans ces mécanismes). J'ai donné quelques explications supplémentaires sur mon cas d'utilisation dans ma question. Faites-moi savoir si c'est assez clair maintenant. – ifischer

-2

Il n'y a pas de moyen direct de le faire. Mais vous pouvez créer un script python pour émuler un terminal bash et vous pouvez utiliser le magnifique module "Subprocess" en python pour exécuter des commnands comme vous le souhaitez