如何對失敗命令的輸出採取行動

如何對失敗命令的輸出採取行動

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

我猜測未能執行的命令的輸出應該發送到標準輸出,因此可以透過管道傳輸。看來我錯了,所以請糾正我。

例如,

$easy_install
The program 'easy_install' is currently not installed.  You can install it by typing:
sudo apt-get install python-setuptools

因此,如果我想使用建議的命令進行安裝,我嘗試過

$easy_install | grep sudo | bash

即天真地嘗試挑選最後一行並將其作為命令發送到 shell。我什至嘗試過

$easy_install | tail -1 | bash

但得到同樣的簡介卻沒有做任何事。我究竟做錯了什麼?

答案1

由於有問題的行是命令,我能想到的最簡單的方法是:

`$easy_install 2>&1 | grep sudo`

反引號或$(…)取得命令管道的輸出並執行它,就像您鍵入它一樣,返回輸出。

sudo請注意,如果您丟失並嘗試安裝該命令,則該命令將不起作用。但由於這顯然是 Ubuntu,所以sudo通常是可用的。為了避免這種情況,您可能想嘗試第二個選擇:

`$easy_install 2>&1 | tail -n 1`

嘗試放棄使用它tail -1,它正在被標準形式取代tail -n 1。我自己發現這很難,但我不喜歡棄用警告。 :)

警告: 如果$easy_install 存在並且您不會得到這種類型的輸出,這些命令中的任何一個都是大量的安全風險。你最終可以執行任意的事情。你可以透過更奢侈來保護自己:

`$easy_install 2>&1 >/dev/null | grep '^sudo apt-get install'`

這會丟棄stdout, 並且只會運行以它開頭的任何內容sudo apt-get install,這很好地限制了事情,但比僅僅自己輸入要煩人得多sudo apt-get install $package

答案2

錯誤輸出通常進入標準錯誤,而不是標準輸出;你可以透過添加來捕捉這一點2>&1

$ easy_install 2>&1 | grep sudo

也就是說,他們正在使用 shell 函數來執行此操作,我懷疑對該函數的微小更改將允許它詢問您,然後自行執行。

相關內容