Как действовать в случае с выходными данными невыполненной команды

Как действовать в случае с выходными данными невыполненной команды

Возможный дубликат:
Какой самый простой способ выполнить текст из tail в командной строке?

Я предполагал, что вывод команды, которая не может быть выполнена, должен быть отправлен в stdout и, следовательно, может быть передан по конвейеру. Кажется, я ошибаюсь, поэтому, пожалуйста, поправьте меня.

Например,

$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

т.е. наивно пытаясь выбрать последнюю строку и отправить ее в оболочку как команду. Я даже пробовал

$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

Тем не менее, для этого они используют функцию оболочки, и я подозреваю, что небольшое изменение этой функции позволит ей сначала задать вам вопрос, а затем сделать это самой.

Связанный контент