Como agir na saída de um comando com falha

Como agir na saída de um comando com falha

Possível duplicata:
Qual é a maneira mais fácil de executar texto tail na linha de comando?

Eu estava supondo que a saída de um comando que não é executado deveria ser enviada para stdout e, portanto, pode ser canalizada. Parece que estou errado, então, por favor, corrija-me.

Por exemplo,

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

Então se eu quiser instalar com o comando sugerido, tentei

$easy_install | grep sudo | bash

ou seja, tentando ingenuamente escolher a última linha e enviá-la para o shell como um comando. eu até tentei

$easy_install | tail -1 | bash

mas obtenha a mesma sinopse sem fazer nada. O que estou fazendo de errado?

Responder1

A maneira mais fácil que consigo pensar, já que a linha em questão é um comando, é:

`$easy_install 2>&1 | grep sudo`

Os crases ou $(…)pegue a saída de um canal de comando e execute-o como se você tivesse digitado, retornando a saída.

Observe que este comando não funcionará se você estiver faltando sudoe tentando instalá-lo. Mas como este é obviamente o Ubuntu, sudogeralmente está disponível. Para evitar isso, você pode tentar sua segunda opção:

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

Tente se livrar do uso tail -1, ele está sendo substituído pelo formulário padrão tail -n 1. Eu também acho isso difícil, mas não gosto de avisos de depreciação. :)

Aviso: se$easy_install existee você não obtém esse tipo de saída, qualquer um desses comandos é umenormerisco de segurança. Você pode acabar executando coisas arbitrárias. Você pode se proteger sendo mais extravagante:

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

Isso descarta stdoute só executará qualquer coisa que comece com sudo apt-get installo que limita bem as coisas, mas é consideravelmente mais irritante do que apenas digitar sudo apt-get install $packagevocê mesmo.

Responder2

A saída de erro normalmente vai para o erro padrão, não para a saída padrão; você pode pegar isso adicionando 2>&1.

$ easy_install 2>&1 | grep sudo

Dito isto, eles estão usando uma função Shell para fazer isso e suspeito que uma pequena alteração nessa função permitiria que ela perguntasse a você e depois fizesse isso sozinho.

informação relacionada