Ctrl使用+S或Ctrl+在命令行历史记录中搜索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
退出。
设置
脚本需要
xdotool
将命令“输入”到终端中:sudo apt-get install xdotool
- 如果不存在则创建目录
~/bin
- 将脚本 1 复制到一个空文件中,保存为
search_history
(无扩展名)~/bin
- 将脚本2复制到一个空文件中,另存为
type_command.sh
(带扩展名) - 使两个脚本都可执行
~/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
答案3
我会做这样的事情:history | grep keyword