2015-08-21 250 views
0

對於培訓,我有想法編寫一個腳本,它將顯示最後一個bash/zsh命令。在Python中運行shell內置命令

首先,我試着用os.systemsubprocess來執行history命令。但是,如你所知,history是一個shell內置的,所以它不會返回任何東西。

然後,我試過這段代碼:

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

如果將這些命令放在shell腳本中並運行它們會發生什麼?你得到你想要的輸出嗎? – 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,前面的命令,來自當前shell嗎? –

+0

是的。例如,運行'cat smtfile'命令後,我運行我的腳本,返回給我的腳本應該包含'cat smtfile' –