有時我正在開發一個新的(ubuntu)盒子,我輸入git
並收到警報:
The program 'git' is currently not installed. You can install it by typing:
apt-get install git-core
如果發生這種情況,我知道我可以透過執行以下操作來獲得最後一行:
!! 2>&1 | tail -n 1
apt-get install git-core
但我要如何才能最輕鬆地執行 ( ) 的結果呢?
我意識到我可以做到
`!! 2>&1 | tail -n 1`
但是否還有一種方法可以實際通過管道輸出並運行它?這似乎不起作用:
!! 2>&1 | tail -n 1 | sh
另外,這2>&1
部分有點麻煩,所以我很好奇是否有更簡單的方法來實現這一點。
編輯
以某種方式將其儲存到變數中,然後執行該變數也是可以接受的:
!! 2>&1 | tail -n 1 | (store as $mycmd)
$mycmd
但我不確定我stdout
是否知道透過管道輸入變數的方法,至少不知道變數位於命令的右側。
答案1
當您鍵入系統中不存在的命令時,bash 會執行 function command_not_found_handle()
。在此函數中呼叫/usr/lib/command-not-found
列印訊息的腳本。
烏班圖12.04
我的第一個猜測是更改此腳本的來源以列印訊息,stdout
但是stderr
當我閱讀腳本的來源時,我發現您可以將其配置為僅詢問您是否要安裝缺少的軟體包。
如果匯出變量,COMMAND_NOT_FOUND_INSTALL_PROMPT
系統會要求您安裝缺少的套件:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm:
舊版本的 Ubuntu
不幸的是沒有COMMAND_NOT_FOUND_INSTALL_PROMPT
,所以我可以找到一些其他選擇:
1)從 12.04 安裝套件 - 這不應該是問題 - 它只是 Python 中的幾個腳本,所以它應該可以工作(未經測試!)。
2) 更改stderr
為stdout
.為此,請編輯文件/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
並更改stderr
為stdout
第 237 行和第 240 行。
之後你可以這樣使用它:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins
如果您在第 237 行和第 240 行中-y
向命令新增選項,apt-get
您也可以使用語法!! | sh
。
3) 你也可以從第242行開始修改這個腳本:
print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()
透過這種方式,您將在文件中獲取命令~/.install-missing
,因此您可以建立別名:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
如果你調用im
套件將會被安裝。
答案2
您走在正確的軌道上:
!! 2>&1 | tail -n 1 | sh
……但你缺少一個選擇噓。考慮:
!! 2>&1 | tail -n 1 | sh -s
由於您可能需要 root 存取權限才能執行 apt-get,請考慮:
!! 2>&1 | tail -n 1 | sudo sh -s
答案3
你可以這樣做:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
互動式程式似乎不能很好地與管道一起工作,因為它需要一個輸入,在本例中為“Y”,但是一旦第一個命令結束,stdin 檔案描述符就會關閉。
答案4
我相信您可以使用變數eval
和命令替換(儘管我不確定這一切有多安全):
TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR
我願意被證明上述觀點是錯的。我正在 Red Hat 機器上使用echo
命令而不是 bash 完成自動建議對此進行測試,但原理應該是相同的。
歸根結底,只需輸入 aptitude install git 會更快...