从下拉列表中搜索历史记录中的命令

从下拉列表中搜索历史记录中的命令

Ctrl使用+SCtrl+在命令行历史记录中搜索R很不错,但它只显示一行。如果能提供针对给定搜索条件的项目下拉列表之类的功能,那就更方便了。有这样的解决方案吗?

答案1

有趣的问题。据我所知,它不存在,

但...

和往常一样,它可以被制造出来。

解决方案是什么

如果你运行例如(在我的系统上):

$ search_history aap

~/.bash_history搜索匹配项:

[1] printf aap
[2] echo aap
[3] du -sh '/home/jacob/Bureaublad/aap' 
[4] echo "een aap op een fiets" | awk '{ print $1 }'
[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: 

正如文字所说,按下数字键可以在当前终端执行相应命令,或者x退出。

设置

  1. 脚本需要xdotool将命令“输入”到终端中:

    sudo apt-get install xdotool
    
  2. 如果不存在则创建目录~/bin
  3. 将脚本 1 复制到一个空文件中,保存为search_history(无扩展名)~/bin
  4. 将脚本2复制到一个空文件中,另存为type_command.sh(带扩展名)
  5. 使两个脚本都可执行
  6. ~/bin要“激活”中的目录$PATH,请执行以下操作之一:

    • 登出/登录,或
    • 跑步source ~/.bashrc

脚本

脚本 1
搜索~/.bash_history匹配(包含)搜索字符串的行,在终端中创建编号列表

#!/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]])

脚本2
输入相应的命令。这必须是另一个(第二个)脚本,因为我们需要退出第一个脚本才能在终端内运行该命令,就像输入命令一样。

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

在此处输入图片描述

笔记

如果您希望跳过重复的行,请在脚本 1 中更改以下行:

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

进入:

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

答案2

我会安装历史建议框马丁·德沃夏克。我在我的所有机器上都使用它。当您输入字符串时,它会显示历史记录中包含的所有命令,包括这些字符串。结果默认按您使用它们的频率排序。您可以使用箭头导航。它非常灵活。

在 Ubuntu 上安装很简单,但你必须添加他的 ppa:

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

该程序通过 hh 调用。

答案3

我会做这样的事情:history | grep keyword

相关内容