2014-04-09 184 views
3

我正在嘗試編寫一個Python或Bash腳本,它可以直接向命令行輸出一個bash命令(例如,如果我只是鍵入它,然後可以按回車鍵執行它)。Python或Bash打印輸出到命令行準備執行

如何以這種方式輸出命令?

+0

如果你使用Python,你可以在仍然使用Python執行命令的地方執行它。我發現這個http://stackoverflow.com/questions/4760215/running-shell-command-from-python-and-capturing-the-output有一個快速搜索,所以你應該能夠找到關於如何做的足夠的信息它。 –

+0

謝謝,但我希望它被輸出到bash命令行,所以我可以通過按回車來執行它,如果我選擇執行它。我也知道如何去做你在bash中的建議。我希望將命令輸出到命令行,而不是執行。 – RCCola

+0

它爲什麼需要在命令行上?爲什麼不讓程序在運行命令前打印命令並等待用戶輸入(如果不想運行該命令,可以取消程序)? –

回答

2

我認爲這是不可能在bash。然而,該提示的功能性的合理子集可以被在bash 4或以後用read內置,並立即執行輸入與eval模擬:

$ read -ei "ls -l"; eval "$REPLY" 

隱續行不可用,例如,如果你以|結束該行;您需要明確提供續行字符,並且下一行也將插入了初始文本,因此您必須在繼續之前清除該行。

+0

'-i'?那是否打算成爲'-r'? –

+1

不; '-i'與'-e'一起使用,以便在接受該行之前在該行上放置一個默認值,該行可以使用'readline'進行編輯。我也在這個例子中討論是否要包含'-r',並決定不允許明確的行繼續。 – chepner

+0

我在我的Linux機器上得到了-i選項,但沒有在我的Mac上:/ mac上的唯一選項是: 'code read:usage:read [-ers] [-u fd] [-t timeout] [ - p提示符] [-a數組] [-n nchar] [-d delim] [name ...]' – RCCola

0

使用BASH,您可以使用select builtin命令輕鬆完成此操作。這裏有一個很好的例子:http://linux.die.net/Bash-Beginners-Guide/sect_09_06.html

+1

你能舉個例子嗎?它看起來不像我想從你發送的鏈接中得到的。 – RCCola

+0

在「ls -l」中選擇命令「echo foo」「df」;做echo「命令:$命令,按執行或停止」;讀; $命令;完成 –

+0

仍然不是我要找的。我希望命令直接寫入到bash命令行中。 – RCCola

0

vim-slime通過screentmux完成類似的事情。這裏的概念在猛砸爲tmux下運行的證明:使用這個從Python的

print_to_cmd_line() { 
    printf '%s' "$*" | tmux load-buffer - 
    tmux paste-buffer -d 
} 
0
cmd=(ls -l "hello world")    # given an array as input 
printf '%q ' -v cmd_quoted "${cmd[@]}"  # transform it to an eval-safe string 
echo "Run the following: $cmd_quoted"  # ...which can then be run by the user 

一種方法是管內容來砸(你當然也可以通過subprocess.Popen()運行相關的bash腳本) :

#!/usr/bin/env python 
import sys 
cmd=['ls', '-l', 'hello world'] 
for element in cmd: 
    sys.stdout.write('%s\0' % element) 

...並在bash,以讀取NUL分隔的輸入和寫EVAL-safe命令:

#!/usr/bin/bash 
arr=() 
while IFS= read -r -d '' entry 
    arr+=("$entry") 
done 
printf '%q ' "${arr[@]}" 
printf '\n' 

...那麼,綁在一起:

./python-gen-cmd | ./bash-gen-cmd 

...會給你一個安全的命令在標準輸出上,準備複製和粘貼,或發送通過SSH連接。即使您的命令包含不可打印的字符或類似的奇怪,這也可以工作。

相關問題