Comando de pesquisa no histórico da lista suspensa

1

Pesquise no histórico da linha de comando usando Ctrl + S ou Ctrl + R é legal, mas mostra apenas uma linha. Seria mais conveniente ter algo como uma lista suspensa de itens para uma determinada condição de pesquisa. Essa solução está disponível?

    
por vico 19.09.2015 / 08:27

3 respostas

1

Pergunta interessante. Não existe tanto quanto eu sei,

MAS ...

como sempre, pode ser feito.

A solução, o que é

Se você executar, e. (no meu sistema):

$ search_history aap

~/.bash_history é pesquisado por correspondências:

[1] printf aap
[2] echo aap
[3] du -sh '/home/jacob/Bureaublad/aap' 
[4] echo "een aap op een fiets" | awk '{ print  }'
[5] sudo chown root '/home/jacob/Bureaublad/aap' 
[6] yad --entry-text=aap
[7] python3 -c "[print(round(float(n)), end=' ') for n in open('test2').read().split()]" > aap
[8] python '/home/jacob/Bureaublad/aap' 


press the number of the line + ENTER to execute, or x to exit: 

Conforme o texto é emitido, pressione o número para executar o comando correspondente no terminal atual ou x para sair.

A configuração

  1. O (s) script (s) precisam de xdotool para "digitar" os comandos no terminal:

    sudo apt-get install xdotool
    
  2. Crie, se não existir, o diretório ~/bin
  3. Copie o script 1 em um arquivo vazio, salve-o como search_history (sem extensão) em ~/bin
  4. Copie o script 2 em um arquivo vazio, salve-o como type_command.sh (com extensão)
  5. Torne os dois scripts executáveis
  6. Para "ativar" o diretório ~/bin em $PATH :

    • logout / in ou
    • executar source ~/.bashrc

O (s) script (s)

script 1
pesquisa ~/.bash_history para linhas, correspondendo (contendo) a string pesquisada, cria uma lista numerada no terminal

#!/usr/bin/env python3
import os
import subprocess
import sys

s = sys.argv[1]
lines = [l for l in open(os.environ["HOME"]+"/.bash_history").read().splitlines() if s in l]
if len(lines) == 0:
    print("no matches")
else:
    for i, l in enumerate(lines):
        print("["+str(i+1)+"]", l)
    nextact = input("\npress the number of the line + ENTER to execute, or x to exit: ")
    if nextact == "x":
        pass
    else:
        # not using try/except because if an error occurs, you might want to know the cause
        subprocess.Popen(["type_command.sh", lines[int(nextact)-1]])

script 2
digita o comando correspondente. Isso tem que ser outro (segundo) script, já que precisamos sair do primeiro script para poder rodar o comando dentro do terminal, assim como um comando digitado.

#!/bin/bash
sleep 0.2
xdotool type ""
xdotool key KP_Enter

Nota

caso você prefira ignorar linhas duplicadas, altere no script 1 a linha:

lines = [l for l in open(os.environ["HOME"]+"/.bash_history").read().splitlines() if s in l]

para:

lines = [l for l in set(open(os.environ["HOME"]+"/.bash_history").read().splitlines()) if s in l]
    
por Jacob Vlijm 19.09.2015 / 10:36
0

Eu instalaria a caixa de sugestões de histórico de Martin Dvorak . Eu uso em todas as minhas máquinas. Conforme você digita uma string, mostra todos os comandos incluídos no histórico, incluindo as strings. Os resultados são, por padrão, classificados pela frequência com que você os usa. Você pode navegar com as setas. É muito flexível.

A instalação no Ubuntu é simples, mas você terá que adicionar o seu ppa:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

O programa é invocado com hh.

    
por Bruni 19.09.2015 / 10:35
0

Eu faria algo assim: history | grep keyword

    
por Root 22.09.2015 / 17:00