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

Иногда я работаю над новым (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 в переменную либо, по крайней мере, не с переменной, находящейся в правой части команды.

  • Почему некоторые изменения файлов не отображаются в хвосте -f?
  • Как сделать «хвост -f» файлов с чередованием логов?
  • tail -f не выводит результат в live CD на Ubuntu
  • Периодически получать новые строки из файла, возможно, зависания
  • Как получить строки от 10 до 100 из 200-строкового файла в новый файл
  • Сохранять счет из файла журнала
  • Как ограничить количество строк выходом команды в bash?
  • Как изменить цвет символа при хвосте и tr
  • 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 …

    Interesting Posts

    Как подключить удаленную файловую систему с указанием номера порта

    ssh-agent не запускается на рабочем столе OpenSuSE

    Вставить буфер обмена в виде текста в буфер клавиатуры

    Проблема с сетью в IBM x3650 после установки Ubuntu 14.04.1

    Восстановить данные из рейда 1, когда оба диска неисправны

    Невозможно установить шрифт urxvt в Fedora 24 с помощью xfce

    Как заставить NetworkManager добавить DNS-сервер вверху /etc/resolv.conf?

    Обновить кеш apt-get только в том случае, если он старше определенного времени

    Как запустить приложение после входа в CentOS?

    SSD в RAID медленнее, чем одно устройство / советы для повышения производительности

    данные восстановления из RAID и сбоя диска (Linux)

    Что такое виртуальный мост с -nic в конце имени

    Создайте «реальный» второй сетевой интерфейс «на лету» для тестирования DHCP

    Как вы загружаете Puppy Linux Slacko в командную строку?

    Копирование порядка в алфавит в сценарий оболочки

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