2010-12-11 81 views
8

我想要的是一种机制,我在Bash-Terminal上输入的所有命令都由Python脚本包装。 Python脚本执行输入的命令,但它增加了一些额外的魔术(例如设置“动态”环境变量)。 这是可能的吗?用Python脚本包装所有在Bash-Shell中输入的命令

我正在运行Ubuntu和Debian Squeezy。

附加说明:

我有一个属性,文件,该文件是动态变化的(某些脚本不改变它在任何时候)。我需要该文件中的属性作为所有shell脚本中的环境变量。当然,我可以从shell中以某种方式解析属性文件,但我更喜欢使用面向对象的风格(尤其是写作),因为它可以通过Python(和ConfigObject)完成。

因此,我想用该Python脚本包裹所有脚本(无需修改脚本本身),该脚本将这些属性处理为所有Shell脚本。 这是我目前的用例,但我可以想象,我会发现其他情况下,我可以在以后扩展我的包装。

+0

请您详细说明您想要做什么?你如何打包shell命令,你将如何执行它们?它可以以两种方式完成(或者更多的方式):a)将命令作为字符串处理,向该字符串添加内容并在bash中运行该字符串; b)获取命令,使用'subprocess'或其他命令执行bash,并传递命令(在另一个命令之前)。 – khachik 2010-12-12 10:21:22

回答

11

将每一个键入到Bash Shell中的命令是在.bashrc中更改变量PROMPT_COMMAND。例如,如果我想每一个命令前做一些Python的东西,尤其爱吃问我的问题:

的.bashrc:

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

现在每前指挥mycoolscript.py脚本运行。

0

我不知道的东西,但两件事情,可以帮助您按照

  1. http://sourceforge.net/projects/pyshint/
  2. IPython的外壳有一些功能在iterpreter执行shell命令。
+1

是的,我知道ipython,但我也想py-ify我的标准shell;) – ifischer 2010-12-12 18:11:42

1

使用Bash的DEBUG陷阱。让我知道你是否需要我详细说明。

编辑:

这里的各种事情的一个简单的例子,你可能能够做到:

$ 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 

你应该知道的security risks of using eval的。

+0

我读了一些关于调试陷阱的东西,但我找不到任何方式如何使用它为我的“问题” – ifischer 2010-12-12 18:11:10

+0

@ifischer:你的python脚本可以影响子shell的环境,但它不会影响当前shell的环境。您需要使用DEBUG陷阱(可能使用Python进行一些处理并将结果作为字符串输出,以便以某种方式应用Bash)在Bash中进行处理,或者如您在答案中所做的那样使用包装器。如果您发布了更多关于您想要完成的具体细节,我可以提供更多帮助或指导您使用其他方法。 – 2010-12-12 21:49:04

+0

只要我用我的x脚本运行每个突击队,就可以在当前shell中不影响变量。所以我对我的解决方案非常满意,除了我必须在每个命令之前键入x(但是如果我想在没有这种机制的情况下运行脚本,这也有一些优点)。我在我的问题中对我的用例做了一些额外的解释。让我知道现在是否清楚了。 – ifischer 2010-12-12 22:23:45

-2

没有直接的方法可以做到这一点。 但是你可以制作一个python脚本来模拟一个bash终端,你可以在python中使用漂亮的“Subprocess”模块以你喜欢的方式执行commnands

相关问题