Каков самый простой способ выполнить текст из хвоста в командной строке?

Иногда я работаю над новым (ubuntu) полем, и я git и предупреждаю:

 The program 'git' is currently not installed. You can install it by typing: apt-get install git-core 

Если это произойдет, я знаю, что могу взять последнюю строку, выполняя что-то вроде:

 !! 2>&1 | tail -n 1 

Но как я могу выполнить результат этого ( apt-get install git-core ) наиболее легко?

Я понимаю, что могу

 `!! 2>&1 | tail -n 1` 

но есть ли способ фактически вывести вывод и запустить его? Это не работает:

 !! 2>&1 | tail -n 1 | sh 

Также 2>&1 часть немного громоздка, поэтому мне было бы любопытно, есть ли более простой способ сделать это тоже.

редактировать

Также было бы приемлемо сохранить это в переменной как-то, а затем выполнить переменную:

 !! 2>&1 | tail -n 1 | (store as $mycmd) $mycmd 

Но я не уверен, что знаю способ переместить stdout в переменную либо, по крайней мере, не с переменной, находящейся в правой части команды.

4 Solutions collect form web for “Каков самый простой способ выполнить текст из хвоста в командной строке?”

Когда вы вводите команду, которой не существует в вашей системе, bash запускает функцию command_not_found_handle() . В этой функции есть вызов сценария /usr/lib/command-not-found который печатает сообщения.

Ubuntu 12.04

Мое первое предположение об изменении источника этого скрипта для печати сообщений в stdout вместо stderr , но когда я читал источник сценария, я обнаружил, что вы можете настроить его, чтобы просто спросить вас, хотите ли вы установить отсутствующий пакет.

Если вы экспортируете переменную COMMAND_NOT_FOUND_INSTALL_PROMPT вас попросят установить отсутствующий пакет:

 pbm@ubuntu:~$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT="" pbm@ubuntu:~$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git Do you want to install it? (N/y)y sudo apt-get install git [sudo] password for pbm: 

Старые версии Ubuntu

К сожалению нет COMMAND_NOT_FOUND_INSTALL_PROMPT поэтому я могу найти несколько других вариантов:

1) Установите пакет с 12.04 – это не должно быть проблемой – это всего несколько скриптов на Python, поэтому он должен работать (непроверенный!).

2) Измените stderr на stdout . Для этого отредактируйте файл /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py и смените stderr на stdout в строках 237 и 240.

После этого вы можете использовать его таким образом:

 pbm@ubuntu:~$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git pbm@ubuntu:~$ `git` //Installation begins 

Если вы добавите опцию -y в команду apt-get в строках 237 и 240, вы также можете использовать синтаксис !! | sh !! | sh !! | sh .

3) Вы также можете изменить этот скрипт из строки 242 следующим образом:

 print >> sys.stderr, _("You can install it by typing:") f = open("%s/.install-missing" % os.path.expanduser('~'),'w') print >> sys.stderr, "sudo apt-get install %s" % packages[0][0] print >> f, "sudo apt-get install %s" % packages[0][0] f.close() 

Таким образом вы получите команду в файле ~/.install-missing , поэтому вы можете создать псевдоним:

 alias im="chmod +x ~/.install-missing; ~/.install-missing" 

Если вы вызовете im пакет, будет установлен.

Вы были на правильном пути:

 !! 2>&1 | tail -n 1 | sh 

… но у вас отсутствует опция sh . Рассматривать:

 !! 2>&1 | tail -n 1 | sh -s 

И поскольку вам, вероятно, нужен root-доступ для запуска apt-get, подумайте:

 !! 2>&1 | tail -n 1 | sudo sh -s 

Вы можете сделать что-то вроде этого:

!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd

Интерактивные программы, похоже, не работают с трубопроводом, потому что он ожидает ввода «Y» в этом случае, но дескриптор файла stdin закрывается, как только заканчивается первая команда.

Вы можете использовать переменную, eval и подстановку команд, которые я считаю (хотя я не уверен, насколько это безопасно все):

 TEST_VAR=$(!! 2>&1 | tail -n 1); eval $TEST_VAR 

Я готов доказать, что ошибаюсь в вышеупомянутом. Я тестирую это на машине Red Hat с помощью команды echo а не на том, что bash завершает автоматический выбор, но принцип должен быть таким же.

В конце концов, было бы проще просто набрать aptitude install git …

  • Проверьте, является ли условие awk совпадением в лог-файле
  • Подавлять сообщения об усечении файла при использовании хвоста
  • Как использовать tail -f с grep для отображения окружающих линий
  • Файл журнала хвоста на нескольких машинах по ssh
  • Извлечь диапазон элементов из i-го элемента в j-й элемент, вплоть до n-го элемента из списка
  • Мониторинг файла журнала и выполнение различных команд в зависимости от разных условий
  • grep не работает в цикле for по списку
  • Добавьте возврат каретки к выходу `tail` при использовании` grep`
  • Отрицательные аргументы для головы / хвоста
  • Как извлечь количество физических процессоров и потоков на ядро? (Нет текста, только номер для использования в качестве входных данных в другом месте)
  • Команда для удаления первого N числа строк на входе
  • Объединение tail && journalctl
  • Interesting Posts

    Нужна ли поддержка ядра поддержки NLS?

    как копировать и переименовывать файлы с помощью «:» и увеличивать число в имени файла

    Добавить cron в Crontab

    Как узнать, что вызвало задержку / замораживание и самозагрузку?

    Функция Shell, чтобы проверить, есть ли приостановленный процесс, являющийся дочерним элементом этой оболочки?

    Обновление Debian: целесообразно или необходимо?

    Настройки автоматического ответа модема Huawei

    Debian создает живое постоянство через Windows

    Fedora теперь пытается подключиться к беспроводной сети при загрузке?

    Статическая конфигурация IPv4 и IPv6 на CentOS 6.2

    Как я могу отслеживать, что использует большинство процессоров?

    Ловушка точка (.) Файл не найден ошибок в KSH

    Может только инициализировать Ad-hoc-режим после перезапуска модуля iwlwifi и сетевого менеджера

    Запуск tomcat под учетной записью сервиса tomcat в CentOS

    Что не так с этим кодом?

    Linux и Unix - лучшая ОС в мире.