2015-08-21 11 views
0

Для обучения у меня есть идея написать скрипт, который отобразит последнюю команду bash/zsh.Запуск командной строки в Python

Прежде всего, я пробовал с os.system и subprocess выполнить команду history. Но, как вы знаете, history - это встроенная оболочка, поэтому она ничего не возвращает.

Затем я попробовал этот кусок кода:

shell_command = 'bash -i -c "history -r; history"' event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)

Но это только что показали команды из последней сессии. То, что я хочу видеть, - это предыдущая команда (которую я только что напечатал) Я пробовал cat ~/.bash_history и имел тот же результат, к несчастью.

Любая идея?

+1

Что вы ожидали/хотели бы показать? –

+0

Что произойдет, если вы поместите эти команды в сценарий оболочки и запустите их? Получаете ли вы результат, который хотите? – dimo414

+0

@ EricRenouf Извините, если я заставил вас смутить. но я хочу, чтобы он показывал предыдущую команду, а не команды в предыдущем сеансе bash –

ответ

2

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

from subprocess import Popen, PIPE, STDOUT 

shell_command = 'bash -i -c "history -r; history"' 
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, 
      stderr=STDOUT) 
out = Popen(["tail", "-n", "1"], stdin=event.stdout, stdout=PIPE) 

output = out.communicate() 
print(output[0]) 

Или просто разделить вывод и получить последнюю строку:

from subprocess import Popen, PIPE, STDOUT 

shell_command = 'bash -i -c "history -r; history"' 
event = Popen(shell_command, shell=True, stdin=PIPE, stdout=PIPE, 
      stderr=STDOUT) 
print(event.communicate()[0].splitlines()[-1]) 

Или почитайте bash_history:

from os import path 
out= check_output(["tail","-n","1",path.expanduser("~/.bash_history")]) 
print(out) 

Или откройте файл на python и просто повторите попытку до тех пор, пока вы не дойдете до конца файла:

from os import path 
with open(path.expanduser("~/.bash_history")) as f: 
    for line in f: 
     pass 
    last = line 
    print(last) 
+0

Мне очень жаль, если я заставил вас смутить, но я просто не знаю, как получить предыдущую команду, а не команды из предыдущего сеанса bash. anw, спасибо за ваш ответ –

+0

@ TùngPun, какие предыдущие команды, из текущей оболочки? –

+0

Да.Например, после запуска команды 'cat smtfile', я запускаю свой скрипт, и то, что оно возвращает ко мне, должно содержать' cat smtfile' –

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

  • Нет связанных вопросов^_^