Когда вы набираете команду, которой нет в вашей системе, 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
.
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
пакет будет установлен.
/usr/lib/command-not-found
но не имеет никакого отношения кCOMMAND_NOT_FOUND_INSTALL_PROMPT
- мысли?Вы были на правильном пути с:
... но вам не хватает опции ш . Рассматривать:
А так как вам, вероятно, нужен root-доступ для запуска apt-get, подумайте:
источник
Вы можете сделать что-то вроде этого:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
Интерактивные программы, похоже, плохо работают с конвейером, потому что он ожидает ввода, в данном случае «Y», но дескриптор файла stdin закрывается, как только первая команда завершается.
источник
eval
Я думаю, вы можете использовать переменную и подстановку команд (хотя я не уверен, насколько это безопасно):Я желаю быть доказанным неправильно с вышеупомянутым. Я тестирую это на машине Red Hat с
echo
командой, а не с автоматическим предложением завершения bash, но принцип должен быть таким же.В конце концов, было бы быстрее набрать aptitude install git ...
источник