2014-11-24 56 views
0

有没有办法创建一个包含管道的整个bash命令的python脚本。bash用python脚本包装管道命令

举例来说,如果我有以下简单的脚本

import sys 
print sys.argv 

,并调用它像这样(从bash或IPython中),我得到预期的结果:

[[email protected] trell]$ python test.py ls 
['test.py', 'ls'] 

如果我添加然而,脚本的输出被重定向到管汇:

[[email protected] trell]$ python test.py ls > out.txt 

> out.txt部分不在sys.argv中。我知道shell会自动处理这个输出,但我很好奇,是否有办法强制shell忽略它并将它传递给被调用的进程。

这个的目的是为shell创建一个类似于包装的东西。我想定期运行这些命令,但要记住每个命令(包括管道)的strace输出。理想情况下,我想保留所有bash功能,例如制表符完成和上下箭头以及历史记录搜索,然后将完成的命令通过一个调用子进程来处理它的python脚本。

这是可能的,还是我必须写我自己的shell来做到这一点?

编辑

看来我要问同样的事情作为this question

+0

术语说明:这不是管道,它是输出重定向。 – chepner 2014-11-24 15:10:41

+0

你是对的。对于那个很抱歉。这一点仍然适用。如果问题不是重定向,而是管道,问题依旧。 – 2014-11-24 15:11:45

回答

0

嗯,我不太明白你在做什么。一般的做法是使用命令行选项将所需的输出目标提供给脚本:python test.py ls --output=out.txt。顺便提一句,strace写给stderr。您可以捕捉使用strace python test.py > out 2> err如果你想保存的一切一切......

编辑:如果你的脚本写至标准错误以及你可以使用strace -o strace_out python test.py > script_out 2> script_err

EDIT2:好的,我更好地了解你想要什么。我的建议是这样的:写庆典帮手:

function process_and_evaluate() 
{ 

    strace -o /tmp/output/strace_output "[email protected]" 

    /path/to/script.py /tmp/output/strace_output 
} 

将这个文件中的像~/helper.sh。然后打开一个bash,使用. ~/helper.sh来源。 现在你可以像这样运行它:process_and_evaluate ls -lA

EDIT3: 要捕获输出/错误,您可以扩展宏是这样的:

function process_and_evaluate() 
{ 
    out=$1 
    err=$2 

    shift 2 

    strace -o /tmp/output/strace_output "[email protected]" > "$out" 2> "$err" 

    /path/to/script.py /tmp/output/strace_output 
} 

你将不得不使用(不太明显)process_and_evaluate out.txt err.txt ls -lA。 这是最好的,我可以拿出...

+0

对,想象一下,我有一个命令'ls -l> ls_output.txt 2> ls_error.txt'。我想像往常一样从shell运行这个命令,但是在我敲入enter和执行命令之间,我想调用一个python脚本,它将命令放在'strace'调用中,然后处理输出。 – 2014-11-24 15:10:41

+0

另外,您的示例不会捕获由重定向生成的文件访问。我们必须运行'strace -o bash -c'ls> ls_out 2> ls_err'',但那不是重点。我希望它由python脚本处理的原因是为每个命令处理strace的输出。 – 2014-11-24 15:14:12

+0

帮助程序不捕获重定向:( – 2014-11-24 15:29:17

0

你可以做的唯一的事情是传递整个shell命令作为一个字符串,然后让Python传回给壳执行。

$ python test.py "ls > out.txt" 

里面test.py,像

subprocess.call("strace " + sys.argv[1], shell=True, executable="/bin/bash") 

,以确保整个字符串传递给shell(和bash,特别是)。

+0

我在包含我试图运行的命令的文本的'.bashrc'中真的没有什么可以改变的吗?它必须存储在某个地方,如果它被记录在历史记录中 – 2014-11-24 15:30:10

+0

据我所知,'bash'根本没有你想要的内省水平 – chepner 2014-11-24 15:36:01

+0

嗯......你碰巧知道另一个外壳吗? – 2014-11-24 15:38:40

0

至少在你的简单例子中,你可以运行Python脚本作为参数来回显,例如,

$ echo $(python test.py ls) > test.txt 
$ more test.txt 
['test.py','ls'] 

用括号括起来的命令首先执行内容然后将输出作为参数传递给echo。