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
-
O (s) script (s) precisam de
xdotool
para "digitar" os comandos no terminal:sudo apt-get install xdotool
- Crie, se não existir, o diretório
~/bin
- Copie o script 1 em um arquivo vazio, salve-o como
search_history
(sem extensão) em~/bin
- Copie o script 2 em um arquivo vazio, salve-o como
type_command.sh
(com extensão) - Torne os dois scripts executáveis
-
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]