Como iniciar a linha com o comando da saída de outro comando

2

Às vezes, a saída de algum comando inclui outros comandos. E gostaria de iniciar esse comando a partir da saída sem usar um mouse. Por exemplo, quando o comando não está instalado, há uma mensagem com linha para instalar este comando:

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

Lá eu gostaria de digitar um comando, que irá iniciar o comando da última linha da saída de htop . Como isso pode ser feito?

Editar: Vou tentar mostrar o que quero dizer. Existem duas linhas na "saída" do comando htop (na verdade, é uma mensagem de erro). A segunda linha desta mensagem é o comando sudo apt-get install htop . Então, eu gostaria de extrair a segunda linha da saída e começar como se fosse o próprio comando. O que se segue é um lixo, mas mostra o que quero dizer:

htop | tail -1 | xargs start_command
    
por Loom 20.01.2014 / 17:31

4 respostas

4

A coisa certa a fazer aqui é configurar o bash para solicitar a instalação, conforme explicado em Resposta do SamK . Vou responder estritamente de uma perspectiva de uso do shell.

Primeiro, o texto que você está tentando pegar está no erro padrão do comando, mas um pipe redireciona a saída padrão , então você precisa redirecionar stderr para stdout.

htop 2>&1 | tail -1

Para usar a saída de um comando como parte de uma linha de comando, use substituição de comando .

$(htop 2>&1 | tail -1)

O resultado da substituição do comando é dividido em palavras e cada palavra é interpretada como um padrão curinga. Aqui isso acontece para fazer a coisa certa: esta é uma linha de comando com palavras separadas por espaços, e não há caracteres curinga.

Para avaliar uma string como um comando shell, use eval . Para tratar o resultado do comando como uma string em vez de uma lista de padrões de caracteres curinga, coloque-o entre aspas duplas.

eval "$(htop 2>&1 | tail -1)"

É claro que, antes de avaliar um comando shell como esse, verifique se ele realmente é o que você deseja executar.

    
por 21.01.2014 / 01:46
4

Geralmente é uma má idéia escrever scripts baseados em mensagens de erro (pense em localização, por exemplo). Você deve usar códigos de saída em vez

No seu caso, encontrei a resposta aqui: link do Gerhard Burger.

Eu cito:

The package that is responsible for this behavior is the command-not-found Install command-not-found package, and it already includes the desired behavior although it is disabled by default. You can enable it by adding the following line to your ~/.bashrc

export COMMAND_NOT_FOUND_INSTALL_PROMPT=1

Now the behavior is changed to

The program 'x' is currently not installed. You can install it by typing:
sudo apt-get install x
Do you want to install it? (N/y)
    
por 20.01.2014 / 18:14
1

Se estiver usando o GNU screen , adicione isso a você ~/.screenrc :

bind R eval copy "stuff kY" "paste ."

Então você pode pressionar Ctrl-A R para inserir o conteúdo da linha acima do cursor.

    
por 20.01.2014 / 17:48
0

Com bash ou mais shells, isso é muito fácil se você souber o formato de saída. Existem várias maneiras de executar os comandos put, mas os que eu mais gosto dependem da expansão variável.

#!/bin/bash

CMD='some/exeutible | parse output with something | and maybe something else'
'$CMD'

O 'diz basicamente' executa o whats entre 'e' e executará comandos armazenados.

Em seu exemplo, você precisa analisar o stderr e a saída e depois estocar a saída analisada entre 'e'. Não vou dizer como analisar a saída, mas dê uma olhada em This deve ajudar na expansão.

    
por 20.01.2014 / 18:13