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

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

  • Файлы с изменением хвоста
  • Будет ли «хвост -100»? sed -n 1p "читать только одну строку?
  • любой способ объединить grep и tail для создания таблицы таблицы из командной строки
  • разделение CSV и сохранение заголовка без промежуточных файлов
  • Почему некоторые изменения файлов не отображаются в хвосте -f?
  • Как извлечь первую и последнюю строки в файле?
  • Создайте список каждого пользователя, которому принадлежит файл в заданном каталоге, а также количество файлов и каталогов, которыми они владеют.
  • Как эхо из определенной строки файла в другую определенную строку
  • 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

    Почему понятие «приятно»?

    Как получить неанемические цвета?

    Как повторить строку для каждого значения соответствующего столбца

    Как удалить строки, содержащие IP-адрес?

    Сообщение «нет такого файла или каталога» при удалении файла, который существует в NTFS

    Как установить Wine 1.7.50 на mac

    Заурус и картографические клавиатуры

    Почему thunderbird покидает рабочее пространство, когда я нажимаю на уведомление?

    Могу ли я клонировать больший диск с большим количеством свободного места на меньший диск

    Xterm «запрос цвета» ничего не печатает

    Перебирать все в директории?

    Баш-оболочка, запущенная forkpty (), порождает дочерние процессы, игнорирующие SIGINT. Почему и как я могу гарантировать, что SIGINT не игнорируется?

    установка на загрузку – как редактировать

    Это ошибка, которую zsh печатает полную строку с printf '% .s'?

    Проверка скрипта выполняется

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