将bash脚本拆分为单独的命令,并一一运行

时间:2019-05-31 23:49:22

标签: python bash shell subprocess gtk

我希望能够从Python运行bash shell脚本(使用类似subprocess.Popen的东西),但是在我的GUI上显示的命令将与{{1 }}和stdout。 GUI应该显示stderr,依此类推。我目前能够为单行bash命令实现它,但是我需要用于多行命令的更复杂的解析器。这是我的代码,仅适用于Input (newline) Output (newline) Input中的简单单行命令。

test.sh:

bash

我的python文件:

ping -c 2 www.google.com

if [ "abc" = "ghi" ]; then
    echo expression evaluated as true
else
    echo expression evaluated as false
fi

如预期的那样,它不适用于涉及with open("test.sh", "r") as script: for line in script: if not line.strip().startswith('#') and not line.strip() == "": print("Debug: Running " + line.strip() + " ...") proc = subprocess.Popen(shlex.split(line), stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: output = str(proc.stdout.readline().strip().decode()) + "" err = str(proc.stderr.readline().strip().decode()) + "" if output == '' and proc.poll() is not None: print("Debug: Command completed...") time.sleep(1) break if output: # Code for updating a Gtk TextView buffer GLib.idle_add(self.updateConsoleText, output + "\n") if err: # Code for updating a Gtk TextView buffer GLib.idle_add(self.updateConsoleText, err + "\n") if-elseloops等的多行代码。我正在寻找一种{至少可以识别命令何时结束,并且在使用多行命令的情况下可以将bash脚本拆分为单独的命令。

您认为您可以帮助我找到这样的库/工具吗?

1 个答案:

答案 0 :(得分:1)

您可以使用trap命令。

这里有一个例子来演示这个概念:

#!/bin/bash

# redirect stderr to a logfile
exec 2>/tmp/test.log

# print commands and arguments at execution
set -x

# set trap for every step, sleep one second.
# "sleep 1" could be every bash command
trap "sleep 1" DEBUG

echo -n "Name: "; read -r name
echo -n "Age: "; read -r age
echo "$name is $age years old"

与此脚本的运行平行,您可以使用tail -f /tmp/test.log来跟踪命令及其参数的调用。