Como agir na saída de um comando com falha [duplicado]

0

Eu estava supondo que a saída de um comando que falha em executar deve ser enviada para stdout e, portanto, pode ser canalizada. Parece que estou errado, 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 selecionar a última linha e enviá-la para o shell como um comando. Eu até tentei

$easy_install | tail -1 | bash

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

    
por kuch nahi 08.04.2012 / 05:58

2 respostas

2

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

'$easy_install 2>&1 | grep sudo'

Os backticks ou $(…) pegam a saída de um pipe de comando e o executam como se você o tivesse digitado, retornando a saída.

Por favor, note que este comando não funcionará se você estiver perdendo sudo e tentando instalá-lo. Mas como isso é obviamente o Ubuntu, sudo está normalmente disponível. Para evitar isso, você pode tentar sua segunda opção:

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

Tente evitar o uso de tail -1 , que está sendo substituído pelo formulário padrão tail -n 1 . Eu acho isso difícil, mas eu não gosto de avisos de depreciação. :)

Aviso : se $easy_install existir e você não obtiver esse tipo de saída, qualquer um desses comandos é uma segurança massiva risco. 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 stdout e só executará qualquer coisa que comece com sudo apt-get install , o que limita muito as coisas, mas é consideravelmente mais irritante do que digitar sudo apt-get install $package .

    
por 08.04.2012 / 10:45
1

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 de shell para fazer isso e eu suspeito que uma pequena alteração nessa função permitiria que ela perguntasse a você e então fizesse ela mesma.

    
por 08.04.2012 / 06:01