Executar a última linha da mensagem de erro como um comando

2

Se você estava tentando executar um pacote que não está instalado, por exemplo:

me ~: gparted 

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

Como posso executar a linha sudo apt-get install gparted como um comando? Não digitando, obviamente.

    
por Quora Feans 06.11.2013 / 22:14

2 respostas

5

Você pode ativá-lo adicionando isso ao seu .bashrc

export COMMAND_NOT_FOUND_INSTALL_PROMPT=1

Dando a você:

$ foo
The program 'foo' is currently not installed. You can install it by typing:
sudo apt-get install blah-blah
Do you want to install it? (N/y)

Se você receber um erro de python como em:

...
  File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 217, in install_prompt
    answer = answer.decode(sys.stdin.encoding)
AttributeError: 'str' object has no attribute 'decode'

Você pode:

Aplicar este patch para o Ubuntu de aqui .
ou:
Modifique CommandNotFound.py adicionando quatro espaços no início das linhas 215,216,217 (nota: guias não ) :

    ...
    213            else:
    214                answer = raw_input(prompt)
    215 4 spaces   if sys.stdin.encoding and isinstance(answer, str):
    216 4 spaces       # Decode the answer so that we get an unicode value
    217 4 spaces       answer = answer.decode(sys.stdin.encoding)
    218            if answer.lower() == _("y"):
    ...

Outra maneira de expandir o comentário de Greg Hewgill poderia ser:

$(!! 2>&1 | tail -n1)

Eu tentei envolvê-lo em um script, mas isso não funcionou fora da caixa porque você não receberá a mensagem de erro.

Se alguém quiser obtê-lo em um script, uma maneira bastante hacky poderia ser:

x=$(/usr/lib/command-not-found $(tail -n1 "$HOME/.bash_history") 2>&1 | tail -n1)
echo "$x"

Para algumas opções, veja:

/usr/lib/command-not-found -help

an / ou confira o próprio script.

    
por 06.11.2013 / 23:56
1

Não há como contornar isso ao meu conhecimento. Você tem duas opções:

  1. digite
  2. copie e cole (que é tecnicamente digitando)

auto-apt

Como uma terceira abordagem, você pode usar a ferramenta auto-apt .

   $ auto-apt run <command_string>

When invoked, the auto-apt command automatically installs packages upon missing file access. If a program tries to access a file known to belong in an uninstalled package, auto-apt will install that package using apt-get. This feature requires apt and sudo to work.

Mas, novamente, esse método não cumpre sua exigência de "não digitar".

Outras ideias

Eu acredito que a instalação que está fornecendo a recomendação para instalar o gparted esteja vinculada ao shell usando uma ferramenta chamada conclusão. Existem regras que você pode expandir para que várias atividades aconteçam quando essas regras são correspondidas.

Poderíamos provavelmente expandir essas regras, ou possivelmente 1 regra, para que o apt-get -y install <package X> seja executado automaticamente.

    
por 06.11.2013 / 23:30