2010-12-11 15 views
8

Quello che mi piacerebbe avere è un meccanismo che tutti i comandi che inserisco su un Bash-Terminal sono avvolti da uno script Python. Lo script Python esegue il comando immesso, ma aggiunge un po 'di magia aggiuntiva (ad esempio l'impostazione di variabili di ambiente "dinamiche"). E 'possibile in qualche modo?Includi tutti i comandi immessi in un Bash-Shell con uno script Python

Sto eseguendo Ubuntu e Debian Squeezy.

spiegazione supplementare:

Ho una struttura a file di che cambia in modo dinamico (alcuni script alterano in qualsiasi momento). Ho bisogno delle proprietà di quel file come variabili d'ambiente in tutti i miei script di shell. Ovviamente potrei analizzare il file di proprietà in qualche modo dalla shell, ma preferisco usare uno stile orientato agli oggetti per questo (specialmente per la scrittura), come si può fare con Python (e ConfigObject).

Quindi voglio avvolgere tutti i miei script con quello script Python (senza dover modificare gli script stessi) che gestisce queste proprietà fino a tutti gli script di Shell. Questo è il mio caso d'uso corrente, ma posso immaginare che troverò ulteriori casi in cui posso estendere il mio wrapper in seguito.

+0

Potresti per favore elaborare più ciò che vuoi fare? Come hai intenzione di avvolgere i comandi della shell e come li eseguirai? Può essere fatto in due (o forse più modi): a) gestire il comando come una stringa, aggiungere qualcosa a quella stringa ed eseguire quella stringa in bash; b) ottenere il comando, eseguire la bash usando 'sottoprocesso' o qualcos'altro e passare il comando (preceduto da qualche altro comando). – khachik

risposta

11

Il modo perfetto per avvolgere ogni comando che viene digitato in una shell Bash è quello di cambiare la variabile PROMPT_COMMAND all'interno di .bashrc. Ad esempio, se voglio fare alcune cose Python prima di ogni comando, è piaciuto chiesto nella mia interrogazione:

.bashrc:

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

ora prima di ogni comando lo script mycoolscript.py viene eseguito.

0

non so di nulla, ma due cose che potrebbero aiutarvi a seguire

  1. http://sourceforge.net/projects/pyshint/
  2. L'ipython shell ha alcune funzionalità per eseguire comandi di shell nel iterpreter.
+1

Sì, conosco ipython ma voglio anche py-ify la mia shell standard;) – ifischer

1

Utilizzare la trap di Bash DEBUG. Fammi sapere se hai bisogno che sviluppi.

Edit:

Ecco un semplice esempio del genere di cose che si potrebbe essere in grado di fare:

$ 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 

È necessario essere consapevoli del security risks of using eval.

+0

Ho letto alcune cose sulla trappola di debug, ma non sono riuscito a trovare alcun modo su come usarlo per il mio "problema" – ifischer

+0

@ifischer: Your python lo script può influenzare l'ambiente di una shell figlia, ma non può influenzare l'ambiente della shell corrente. Dovrai eseguire la tua elaborazione in Bash usando la trappola DEBUG (probabilmente con Python che elabora il risultato come stringa per Bash da applicare in qualche modo) o usa un wrapper come hai fatto nella tua risposta. Se pubblichi dettagli più specifici su ciò che stai cercando di ottenere, posso essere più di aiuto o indirizzarti a un metodo diverso da utilizzare. –

+0

Va bene che le variabili non sono influenzate nella shell corrente, a patto che eseguo ogni comando con il mio x-script. Quindi sono abbastanza soddisfatto della mia soluzione, tranne che devo digitare x prima di ogni comando (ma questo ha anche qualche tipo di vantaggio se voglio eseguire script senza questo meccanismo). Ho fornito alcune spiegazioni aggiuntive sul mio caso d'uso nella mia domanda. Fammi sapere se ora è abbastanza chiaro. – ifischer

-2

Non esiste un modo diretto per farlo. Ma puoi creare uno script python per emulare un terminale bash e puoi usare il bellissimo modulo "Sottoprocesso" in python per eseguire comandi nel modo che preferisci

Problemi correlati