Quando você digita o comando que não existe no sistema, o bash executa a função command_not_found_handle()
. Nesta função, há uma chamada para /usr/lib/command-not-found
script que imprime mensagens.
Ubuntu 12.04
Minha primeira suposição a fonte mudança desse script para imprimir mensagens de stdout
vez stderr
, mas fonte quando eu estava lendo de script que eu descobri que você pode configurá-lo para apenas perguntar se você deseja instalar o pacote faltando.
Se você exportar variável, COMMAND_NOT_FOUND_INSTALL_PROMPT
você será solicitado a instalar o pacote ausente:
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:
Versões anteriores do Ubuntu
Infelizmente não há, COMMAND_NOT_FOUND_INSTALL_PROMPT
para que eu possa encontrar algumas outras opções:
1) Instale o pacote a partir do 12.04 - não deve ser o problema - são apenas alguns scripts em Python, portanto devem funcionar (não testados!).
2) Mude stderr
para stdout
. Para fazer isso, edite o arquivo /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
e altere stderr
para stdout
nas linhas 237 e 240.
Depois disso, você pode usá-lo desta maneira:
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
Se você adicionar a -y
opção de apt-get
comando nas linhas 237 e 240, também poderá usar a sintaxe !! | sh
.
3) Você também pode modificar este script da linha 242 desta maneira:
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()
Dessa forma, você receberá seu comando no arquivo ~/.install-missing
, portanto, você pode criar um alias:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Se você chamar o im
pacote será instalado.
/usr/lib/command-not-found
mas não tem referência aCOMMAND_NOT_FOUND_INSTALL_PROMPT
- pensamentos?Você estava no caminho certo com:
... mas você está perdendo uma opção para sh . Considerar:
E como você provavelmente precisa de acesso root para executar o apt-get, considere:
fonte
Você pode fazer algo assim:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
Os programas interativos parecem não funcionar bem com a tubulação, porque espera uma entrada 'Y' neste caso, mas o descritor de arquivo stdin é fechado assim que o primeiro comando é concluído.
fonte
Você pode usar uma variável
eval
e substituição de comando, acredito (embora não tenha certeza de quão seguro isso tudo seria):Estou disposto a provar que estou errado com o exposto acima. Estou testando isso em uma máquina Red Hat com um
echo
comando, em vez de sugerir automaticamente a conclusão do bash, mas o princípio deve ser o mesmo.No final do dia, seria mais rápido digitar o aptitude install git ...
fonte