【问题标题】:Tool/script to search my saved commands (not bash history) from linux command line从 linux 命令行搜索我保存的命令(不是 bash 历史记录)的工具/脚本
【发布时间】:2015-06-09 00:33:45
【问题描述】:

在 linux/bash 中,reverse-i-search (Ctrl+R) 只搜索历史记录

有没有我可以的包(比如 reverse-i-search):

a ) save a command that I like
b ) search the saved list of commands - much like reverse-i-search ?

别名并将其添加到 .bash_profile 的问题是它们不可修改。 例如,我经常使用 'git rebase -i HEAD~NUM' 我只能为某些 NUM 设置别名,而使用 reverse-i-search 我可以检索命令,编辑并执行它。

谢谢。

【问题讨论】:

  • 为什么需要工具?你不能只维护一个文本文件吗?
  • 不方便,尤其是如果您是开发人员
  • 真的吗?你过于笼统了。开发人员以各种方式工作。文本是通用界面,我可以用它做任何事情并编写各种工具(我会这样做)。
  • 无论如何,您可能对大量可让您扩展 sn-ps 的工具感兴趣。在 OS X 上通常推荐使用 TextExpander、Dash 等。在 Emacs 中通常推荐使用 yasn-p。我对其他环境不太熟悉(反正我是从 OS X 做 Linux 开发的),所以我不能说什么是最好的。
  • 顺便说一句,这看起来像是一个购物清单问题,所以它可能会被投票接近。

标签: linux bash


【解决方案1】:

你可以:

  • 只需将它们添加到您的历史记录中,然后使用 Ctrl+R 搜索即可。

    如果您一直在避免这种情况,因为您发现线条从历史中消失,那就是 configurable

  • 将它们添加为别名并使用bind '"\C-k": alias-expand-line'。这将让您输入例如myalias,按Ctrl+K,它会展开成完整的命令,然后你可以修改。

  • 编写接受参数的函数,比如rebase() { git rebase -i HEAD~$1; },这样你就不需要修改它了。你可以运行rebase 4

【讨论】:

  • 将其添加到搜索历史记录?喜欢追加到 bash 历史记录?还有这个命令会消失的一个月内最大历史记录的问题
  • @purpletech 是的。如果您继续阅读,您会发现这个问题可以通过一个链接解决,该链接说明如何避免丢失任何历史记录。另请注意,这是三个独立的建议,其中只有第一个完全依赖于历史记录。
  • 理想情况下,我希望为我保存的命令创建第二个文件/数据库,并保留 bash 历史记录。
  • @purpletech 好的。让你的 bash 历史单独存在的两个建议是否合适?
【解决方案2】:

保存您的命令

这是我在 save.sh 周围的工作:

#!/bin/bash
echo $1
if [ -z $1 ] && [ -z $2 ] ; then
echo 'not enough param'
else
echo 'alias' $2'="'$1'"' >> ~/.bash_aliases;
echo 'done';
fi

这将在您的bash_aliases 文件中存储一个新别名,以便您以后调用它。 只需将其放在您想要的任何位置,记得将其 chmod 为可执行文件。

用法:

$ ./save.sh 'echo nice' ncm
# this will refresh your bash alias so you dont have 
$ source ~/.bashrc to restart terminal or open new one.
$ ncm
nice

历史扩展

此外,您可以在历史记录中搜索最后一条命令并执行它:

 !! #to run last command again
 !!:p #to print last command

!prefix 运行最后一个匹配前缀的命令,例如:

 ~$ !echo
 echo nice #my last echo command 

更多文档:History Expansion

【讨论】:

    【解决方案3】:

    我有一个简单的方案,允许从 shell 提示符中搜索历史记录,返回 grep 类似我目前感兴趣的历史记录中的任何术语的结果。没有任何魔法,只需设置您想要在历史记录中维护的条目数,以及您希望历史记录的行为方式(例如,ignoreboth:erasedups 不向您的历史记录列表添加以 空格开头的命令 并忽略重复的条目。包含erasedups 是为了清除由于使用其他历史文件或将可能包含重复的部分移动到使用中而导致的任何重复)

    您可以简单地 export 来自您的 .bashrc(或您使用的任何 shell 中的类似启动文件)中的历史控制值,例如要在历史记录中保持 20K 命令的整洁列表,您可以这样做:

    export HISTFILESIZE=20000
    export HISTSIZE=20000
    export HISTCONTROL=ignoreboth:erasedups
    

    (您还拥有HISTIGNORE 环境变量,可让您更精细地控制将哪些内容添加到您的历史文件中,或不添加到您的历史文件中。)

    通过整洁的历史文件,您可以方便地使用历史文件中包含的所有值,并在您的.bashrc(或适当的启动文件)中使用一个简短的函数,然后使用一个方便的alias 来调用该函数。例如:

    showhist() {
        [ -z "$1" ] && { printf "usage:  hist <search term>\n"; return 1; }
        history | grep "$1"
        return 0
    }
    
    alias hist='showhist'
    

    showhist 函数需要一个 single_search 术语来搜索您的历史条目。我不喜欢打字,所以我将alias 函数进一步简化为hist。如果您未能提供任何输入,则会打印一个简短的usage: 提醒您预期的内容。

    所以当我想调用一个我有一段时间没有运行的命令以及它所使用的任何参数时(比如在 Arch 上安装 grub2),我只需发出命令:

    # hist grub
       99  pacman -S grub
      100  grub-install --target=i386-pc /dev/sda
      101  grub-mkconfig -o /boot/grub/grub.cfg
      211  vi /boot/grub/grub.cfg
     <snip>
    

    所需命令的简单突出显示和命令行中的鼠标中键粘贴,我只需在提示符处键入hist grub 即可检索到不常用的命令...完成。

    如果您正在寻找类似的东西,请尝试这种方法。根据您使用命令行的频率,构建完整的命令集需要一段时间,但无论如何,如果您有当前的历史文件,此设置将立即有用。

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多