2014-11-24 2 views
0

Есть ли способ создать скрипт python, который обертывает всю команду bash, включая трубы.bash wrap the piped command с скриптом python

Например, если у меня есть следующий простой скрипт

import sys 
print sys.argv 

и называть это как так (от Баш или IPython), я получаю ожидаемый результат:

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

Если добавить трубы, однако, вывод сценария перенаправляется к раковине трубы:

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

И > out.txt часть не находится в sys.argv. Я понимаю, что оболочка автоматически обрабатывает этот вывод, но мне любопытно, есть ли способ заставить оболочку игнорировать его и передать его процессу, вызываемому.

Дело в том, чтобы создать нечто вроде оболочки для оболочки. Я хотел бы регулярно запускать команды, но отслеживать вывод strace для каждой команды (включая трубы). В идеале я хотел бы сохранить все функции bash, такие как табуляция, стрелки вверх и вниз и поиск по истории, а затем просто передать завершенную команду через скрипт python, который вызывает подпроцесс для его обработки.

Возможно ли это, или мне придется написать свою собственную оболочку, чтобы сделать это?

Редактировать

Оказывается, я спрашиваю, точно такую ​​же вещь, как this question.

+0

Замечание по терминологии: это не труба, это перенаправление вывода. – chepner

+0

Вы правы. Извини за это. Тем не менее, точка все же действует. Проблема остается прежней, если она не была перенаправлением, а вместо нее. –

ответ

0

Ну, я не совсем понимаю, что вы пытаетесь сделать. Общий подход заключался бы в том, чтобы указать желаемый конечный результат для сценария, используя параметры командной строки: python test.py ls --output=out.txt. Кстати, strace пишет stderr. Вы могли бы захватить все с помощью strace python test.py > out 2> err если вы хотите сохранить все ...

Edit: Если ваш скрипт записывает стандартный вывод, а также вы можете использовать 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'. Я хотел бы запустить эту команду из оболочки, как обычно, но между ними, когда я нажимаю enter и выполняю команду, я бы хотел вызвать скрипт python, который будет завершать команду в вызове 'strace', а затем обрабатывать выход. –

+0

Кроме того, ваш пример не будет захватывать обращения к файлам, сгенерированные перенаправлением. Можно было бы запустить 'strace -o bash -c 'ls> ls_out 2> ls_err"', но это не относится к делу. Причина, по которой я хочу, чтобы он обрабатывался скриптом python, заключается в обработке вывода strace для каждой команды. –

+0

Помощник не фиксирует перенаправление :( –

0

Единственное, что вы можете сделать, это передать всю команду оболочки в виде строки, а затем передать Python в оболочку для выполнения.

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

Внутри test.py, что-то вроде

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

для обеспечения вся строка передается в оболочке (и bash, в частности).

+0

В «.bashrc» я ничего не могу изменить, который содержит текст команды, которую я пытаюсь запустить? Он должен быть где-то сохранен, если он записывается в историю file –

+0

Насколько я знаю, 'bash' просто не имеет уровня самоанализа, который вы ищете. – chepner

+0

Хммм ... вы случайно узнали о другой оболочке? –

0

По крайней мере, в вашем простом примере вы можете просто запустить скрипт python в качестве аргумента для эха, например.

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

вшита команда в скобках со знаком доллара первым выполняет содержимое затем передает выходной сигнал в качестве аргумента для эха.

Смежные вопросы