Cómo actuar ante la salida de un comando fallido

Cómo actuar ante la salida de un comando fallido

Posible duplicado:
¿Cuál es la forma más sencilla de ejecutar texto desde la cola en la línea de comando?

Supuse que la salida de un comando que no se ejecuta debería enviarse a la salida estándar y, por lo tanto, puede canalizarse. Parece que estoy equivocado, así que corrígeme.

Por ejemplo,

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

Entonces, si quiero instalar con el comando sugerido, intenté

$easy_install | grep sudo | bash

es decir, intentar ingenuamente seleccionar la última línea y enviarla al shell como un comando. Incluso lo intenté

$easy_install | tail -1 | bash

pero recibe la misma propaganda sin que haga nada. ¿Qué estoy haciendo mal?

Respuesta1

La forma más sencilla que se me ocurre, dado que la línea en cuestión es un comando, es:

`$easy_install 2>&1 | grep sudo`

Las comillas invertidas o $(…)toman la salida de una canalización de comando y la ejecutan como si la hubiera escrito, devolviendo la salida.

Tenga en cuenta que este comando no funcionará si lo falta sudoe intenta instalarlo. Pero como obviamente se trata de Ubuntu, sudonormalmente está disponible. Para evitar esto, quizás quieras probar tu segunda opción:

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

Intente dejar de usarlo tail -1, está siendo reemplazado por la forma estándar tail -n 1. A mí esto me resulta difícil, pero no me gustan las advertencias de desaprobación. :)

Advertencia: si$easy_install existey no obtienes este tipo de resultado, cualquiera de estos comandos es unmasivoriesgo de seguridad. Puedes terminar ejecutando cosas arbitrarias. Puedes protegerte siendo más extravagante:

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

Esto descarta stdouty solo ejecutará cualquier cosa que comience con sudo apt-get installlo que limita muy bien las cosas, pero es considerablemente más molesto que simplemente escribir sudo apt-get install $packageusted mismo.

Respuesta2

La salida de error normalmente llega al error estándar, no a la salida estándar; puedes captarlo agregando 2>&1.

$ easy_install 2>&1 | grep sudo

Dicho esto, están usando una función de shell para hacer eso y sospecho que un cambio menor en esa función le permitiría preguntarle y luego hacerlo él mismo.

información relacionada