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

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

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

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

  • Есть ли способ слушать процесс?
  • Определите количество уникальных значений, а затем количество вхождений этих значений в файл
  • Требуется специальная проверка сценария оболочки
  • Переименование тысяч файлов с похожими именами
  • Как перенаправить вывод программы в ZIP-файл?
  • Как заставить yum устанавливать без запроса пользователя, используя bash?
  •  !! 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 в переменную либо, по крайней мере, не с переменной, находящейся в правой части команды.

  • Добавление разрывов между каждыми двумя словами в bash
  • Передача именованных аргументов в сценарии оболочки
  • Как создать и выполнить скрипт bash, который вызывает исполняемый файл из более высокой папки?
  • Oneliner, который печатает группы и их номера, начинающиеся с «1»?
  • Не удалось сохранить вывод команды в переменной
  • Подождите, пока подошвы Bash
  • 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 …

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