在命令列中從 tail 執行文字的最簡單方法是什麼?

在命令列中從 tail 執行文字的最簡單方法是什麼?

有時我正在開發一個新的(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) 更改stderrstdout.為此,請編輯文件/usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py並更改stderrstdout第 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 會更快...

相關內容