O comando $(!! |& tail -1)
deve fazer:
$ git something
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
$ $(!! |& tail -1)
$(git something |& tail -1)
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
git-man liberror-perl
Como você pode ver, o comando sudo apt-get install git
está sendo executado.
EDITAR: Desmembrando $(!! |& tail -1)
-
$()
é o padrão de substituição do comandobash
-
bash
expandirá!!
para o último comando executado -
|&
part é complicado. Normalmente pipe|
pegará o STDOUT do comando do lado esquerdo e passará como STDIN para o comando no lado direito do|
, no seu caso o comando anterior imprime sua saída no STDERR como uma mensagem de erro. Então, fazer|
não ajudaria, precisamos passar tanto o STDOUT quanto o STDERR (ou somente o STDERR) para o comando do lado direito.|&
passará o STDOUT e o STDERR como o STDIN para o comando do lado direito. Alternativamente, melhor você só pode passar o STDERR:$(!! 2>&1 >/dev/null | tail -1)
-
tail -1
, como de costume, imprimirá a última linha de sua entrada. Aqui, em vez de imprimir a última linha, você pode ser mais preciso, como imprimir a linha que contém o comandoapt-get install
:$(!! 2>&1 >/dev/null | grep 'apt-get install')