
Возможный дубликат:
Какой самый простой способ выполнить текст из 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
Тем не менее, для этого они используют функцию оболочки, и я подозреваю, что небольшое изменение этой функции позволит ей сначала задать вам вопрос, а затем сделать это самой.