Оберните все команды, введенные в Bash-Shell, скриптом Python - PullRequest
10 голосов
/ 11 декабря 2010

Я хотел бы иметь механизм, чтобы все команды, которые я ввожу в Bash-Terminal, были обернуты Python-скриптом. Python-скрипт выполняет введенную команду, но добавляет дополнительную магию (например, устанавливает «динамические» переменные окружения). Это возможно как-то?

Я использую Ubuntu и Debian Squeezy.

Дополнительное объяснение:

У меня есть файл свойств, который изменяется динамически (некоторые сценарии изменяют его в любое время). Мне нужны свойства этого файла в качестве переменных среды во всех моих сценариях оболочки. Конечно, я мог бы как-то разобрать файл свойств из оболочки, но я предпочитаю использовать для этого объектно-ориентированный стиль (особенно для записи), как это можно сделать с помощью Python (и ConfigObject).

Поэтому я хочу обернуть все мои скрипты тем скриптом Python (без необходимости изменения самих скриптов), который обрабатывает эти свойства вплоть до всех шелл-скриптов. Это мой текущий вариант использования, но я могу себе представить, что найду дополнительные случаи, на которые я смогу расширить свою обертку позже.

Ответы [ 4 ]

13 голосов
/ 17 января 2012

Идеальный способ обернуть каждую команду, которая вводится в Bash Shell, - это изменить переменную PROMPT_COMMAND внутри .bashrc. Например, если я хочу сделать некоторые вещи Python перед каждой командой, мне задали вопрос:

.bashrc:

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

теперь перед каждой командой запускается скрипт mycoolscript.py.

1 голос
/ 11 декабря 2010

Используйте ловушку Баша 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

Вы должны знать о угрозах безопасности при использовании eval.

0 голосов
/ 12 декабря 2010

Нет прямого способа сделать это. Но вы можете создать скрипт на python для эмуляции терминала bash и использовать прекрасный модуль «Subprocess» в python для выполнения команд так, как вам нравится

0 голосов
/ 11 декабря 2010

Я не знаю ничего, кроме двух вещей, которые могли бы помочь вам следовать

  1. http://sourceforge.net/projects/pyshint/
  2. Оболочка iPython имеет некоторые функции для выполнения команд оболочки в iterpreter.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...