2010-12-11 14 views
8

Lo que me gustaría tener es un mecanismo que todos los comandos que ingrese en un Bash-Terminal estén envueltos por un script de Python. El script de Python ejecuta el comando ingresado, pero agrega algo de magia adicional (por ejemplo, establecer variables de entorno "dinámicas"). ¿Es eso posible de alguna manera?Ajustar todos los comandos ingresados ​​dentro de un Bash-Shell con un script de Python

Estoy ejecutando Ubuntu y Debian Squeezy.

explicación adicional:

Tengo un archivo de propiedades que cambia dinámicamente (algunos scripts alteran en cualquier momento). Necesito las propiedades de ese archivo como variables de entorno en todos mis scripts de shell. Por supuesto, podría analizar el archivo de propiedades de algún modo desde shell, pero prefiero usar un estilo orientado a objetos para eso (especialmente para escribir), como se puede hacer con Python (y ConfigObject).

Por lo tanto, quiero ajustar todos mis scripts con esa secuencia de comandos de Python (sin tener que modificar los scripts por sí mismos) que maneja estas propiedades en todos los scripts de Shell. Este es mi caso de uso actual, pero me puedo imaginar que encontraré casos adicionales a los que puedo extender mi envoltorio más adelante.

+0

¿Podría por favor elaborar más lo que quiere hacer? ¿Cómo vas a ajustar los comandos de shell y cómo vas a ejecutarlos? Se puede hacer en dos (o tal vez en más formas): a) manejar el comando como una cadena, agregar algo a esa cadena y ejecutar esa cadena en bash; b) obtener el comando, ejecutar el bash usando 'subprocess' u otra cosa y pasar el comando (precedido por algún otro comando). – khachik

Respuesta

11

La forma perfecta de ajustar cada comando que se escribe en un Bash Shell es cambiar la variable PROMPT_COMMAND dentro de .bashrc. Por ejemplo, si quiero hacer algunas cosas antes de cada comando Python, le gustaba pedido en mi pregunta:

.bashrc:

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

ahora antes de cada comando se ejecuta el script mycoolscript.py.

0

No sé de nada pero hay dos cosas que pueden ayudarle a seguir

  1. http://sourceforge.net/projects/pyshint/
  2. El IPython Shell tiene algunas funciones para ejecutar comandos shell en el iterpreter.
+1

Sí, sé ipython, pero también quiero py-ify mi shell estándar;) – ifischer

1

Usar la trampa de Bash's DEBUG. Avísame si necesitas que lo detalle.

Editar:

Aquí está un ejemplo simple de los tipos de cosas que usted podría ser capaz de hacer:

$ 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 

Usted debe ser consciente de la security risks of using eval.

+0

He leído algunas cosas sobre la trampa de depuración, pero no he podido encontrar ninguna manera de cómo usarlo para mi "problema" – ifischer

+0

@ifischer: Su pitón La secuencia de comandos puede influir en el entorno de un shell secundario, pero no puede influir en el entorno del shell actual. Tendrá que hacer su procesamiento en Bash usando la trampa DEBUG (posiblemente con Python procesando y enviando el resultado como una cadena para que Bash lo aplique de alguna manera) o use un wrapper como lo ha hecho en su respuesta. Si publica detalles más específicos sobre lo que está tratando de lograr, puedo ser más útil o dirigirlo a un método diferente para usar. –

+0

Está bien que las variables no estén influenciadas en el shell actual, siempre y cuando ejecute cada comando con mi script x. Así que estoy bastante satisfecho con mi solución, excepto que tengo que escribir x antes de cada comando (pero esto también tiene algunas ventajas si quiero ejecutar scripts sin este mecanismo). Di algunas explicaciones adicionales sobre mi caso de uso en mi pregunta. Avísame si ya está claro. – ifischer

-2

No hay forma directa de hacerlo. Pero puede hacer un script de Python para emular un terminal de bash y puede usar el hermoso módulo "Subproceso" en python para ejecutar comunicaciones de la manera que desee

Cuestiones relacionadas