2010-12-11 13 views
8

Was ich gerne hätte, wäre ein Mechanismus, bei dem alle Befehle eines Bash-Terminals durch ein Python-Skript umschlossen werden. Das Python-Skript führt den eingegebenen Befehl aus, fügt aber zusätzliche Magie hinzu (zum Beispiel das Setzen von "dynamischen" Umgebungsvariablen). Ist das irgendwie möglich?Alle Befehle, die in einer Bash-Shell eingegeben wurden, mit einem Python-Skript umhüllen

Ich benutze Ubuntu und Debian Squeezy.

Zusätzliche Erklärung:

Ich habe eine Eigenschaft-Datei, die dynamisch ändert (einige Skripte nicht zu einer Veränderung es jederzeit möglich). Ich brauche die Eigenschaften aus dieser Datei als Umgebungsvariablen in allen meinen Shell-Skripten. Natürlich könnte ich die Eigenschaft-Datei irgendwie aus der Shell parsen, aber ich bevorzuge dafür einen objektorientierten Stil (speziell zum Schreiben), wie es mit Python (und ConfigObject) gemacht werden kann.

Daher möchte ich alle meine Skripte mit diesem Python-Skript (ohne die Skripte selbst zu ändern), die diese Eigenschaften auf alle Shell-Skripte behandelt, umschließen. Dies ist mein aktueller Anwendungsfall, aber ich kann mir vorstellen, dass ich weitere Fälle finden werde, auf die ich später meinen Wrapper erweitern kann.

+0

Könnten Sie bitte mehr ausarbeiten, was Sie tun möchten? Wie werden Sie Shell-Befehle umbrechen und wie werden Sie sie ausführen? Es kann auf zwei (oder vielleicht mehr) Arten geschehen: a) Behandle den Befehl als String, füge etwas zu diesem String hinzu und führe diesen String in bash aus; b) Holen Sie den Befehl, führen Sie die Bash mit 'subprocess' oder etwas anderem aus und übergeben Sie den Befehl (vor einem anderen Befehl). – khachik

Antwort

11

Die perfekte Möglichkeit, jeden Befehl, der in eine Bash Shell getippt ist zu umbrechen ist, die Variable PROMPT_COMMAND in der .bashrc zu ändern. Zum Beispiel, wenn ich vor jedem Befehl einige Python Sachen tun wollen, gern in meiner Frage gestellt:

Bashrc:

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

jetzt vor jedem Befehl das Skript mycoolscript.py ausgeführt wird.

0

Ich weiß nicht von irgendetwas, aber zwei Dinge, die helfen könnten Sie folgen

  1. http://sourceforge.net/projects/pyshint/
  2. Die ipython Shell einige Funktionen hat Shell-Befehle in der iterpreter auszuführen.
+1

Ja, ich weiß Ipython, aber ich möchte auch py-ify meine Standard-Shell;) – ifischer

1

Verwenden Sie Bash DEBUG Trap. Lass es mich wissen, wenn du mich zur Ausarbeitung brauchst.

Edit:

Hier ist ein einfaches Beispiel für die Art der Dinge, die Sie tun können:

$ 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 

Sie sollten sich der security risks of using eval bewusst sein.

+0

Ich habe ein paar Sachen über die Debug-Falle gelesen, aber ich konnte keinen Weg finden, wie ich es für mein "Problem" verwenden kann – ifischer

+0

@ifischer: Ihre Python Skript kann die Umgebung einer Child-Shell beeinflussen, aber es kann die Umgebung der aktuellen Shell nicht beeinflussen. Sie müssen Ihre Verarbeitung in Bash mit Hilfe der DEBUG-Trap (möglicherweise mit Python einige Verarbeitung und Ausgabe des Ergebnisses als String für Bash in irgendeiner Weise) oder verwenden Sie einen Wrapper, wie Sie in Ihrer Antwort getan haben. Wenn Sie genauere Details zu dem, was Sie erreichen möchten, veröffentlichen, kann ich Ihnen helfen oder Sie zu einer anderen Methode führen. –

+0

Es ist in Ordnung, dass die Variablen in der aktuellen Shell nicht beeinflusst werden, solange ich jedes Kommando mit meinem x-Skript ausführe. Ich bin also ziemlich zufrieden mit meiner Lösung, außer dass ich vor jedem Befehl x eingeben muss (aber das hat auch Vorteile, wenn ich Skripte ohne diese Mechanismen ausführen möchte). Ich habe in meiner Frage einige zusätzliche Erklärungen zu meinem Anwendungsfall gegeben. Lass es mich wissen, wenn es jetzt klar genug ist. – ifischer

-2

Es gibt keinen direkten Weg, wie Sie es tun können. Aber Sie können ein Python-Skript zu emulieren ein Bash-Terminal machen und Sie können das schöne "Subprocess" -Modul in Python verwenden, um commnands wie Sie möchten

Verwandte Themen