将当前目录保存到bash历史记录

我想保存当前目录中的每个命令发出的历史记录中的命令。为了不乱糟糟,我正在考虑添加当前目录作为注释在行尾。一个例子可能有帮助:
$ cd /usr/local/wherever
$ grep timmy accounts.txt

我想bash保存最后一个命令为:

grep timmy accounts.txt # /usr/local/wherever

想法是这样我可以立即看到我发出命令的地方。

单线版本

这是一个单线版本。这是原来的。我还发布了一个短功能版本和一个长功能版本,增加了几个功能。我喜欢的功能版本,因为他们不会打扰你的环境中的其他变量,它们比一行程序更可读。这篇文章有一些信息,他们如何所有的工作,可能不会在其他人重复。

将以下内容添加到〜/ .bashrc文件中:

export PROMPT_COMMAND='hpwd=$(history 1); hpwd="${hpwd# *[0-9]*  }"; if [[ ${hpwd%% *} == "cd" ]]; then cwd=$OLDPWD; else cwd=$PWD; fi; hpwd="${hpwd% ### *} ### $cwd"; history -s "$hpwd"'

这使得历史记录条目看起来像:

rm subdir/file ### /some/dir

我使用###作为注释分隔符,将其与用户可能键入的注释分开,并在剥离旧路径注释时减少冲突的机会,否则如果在空白命令行上按Enter键将会累积。不幸的是,副作用是像echo“###”这样的命令被修改,虽然这应该是相当罕见的。

有些人会发现,我重用相同的变量名称是不愉快的事实。通常我不会,但在这里我想尽量减少足迹。在任何情况下都很容易改变。

它盲目地假设您不使用HISTTIMEFORMAT或以某种其他方式修改历史记录。这将很容易添加一个日期命令到注释代替HISTTIMEFORMAT功能。但是,如果由于某种原因需要使用它,它仍然在子shell中工作,因为它会自动取消设置:

$ htf="%Y-%m-%d %R "    # save it for re-use
$ (HISTTIMEFORMAT=$htf; history 20)|grep 11:25

有几个非常小的问题。一个是如果你使用这样的历史命令,例如:

$ history 3
echo "hello world" ### /home/dennis
ls -l /tmp/file ### /home/dennis
history 3

结果将不会显示对历史命令本身的注释,即使你将看到它,如果你按向上箭头或发出另一个历史命令。

另一个是带有嵌入的换行符的命令除了注释的副本之外,在历史中留下未注释的副本。

可能还有其他问题出现。让我知道,如果你发现任何。

怎么运行的

每次发出PS1主提示时,Bash都会执行包含在PROMPT_COMMAND变量中的命令。这个小脚本利用它来抓取历史中的最后一个命令,添加一个注释并保存回来。

这里它分开与评论:

hpwd=$(history 1)              # grab the most recent command
hpwd="${hpwd# *[0-9]*  }"      # strip off the history line number
if [[ ${hpwd%% *} == "cd" ]]   # if it's a cd command,we want the old directory
then                           #   so the comment matches other commands "where *were* you when this was done?"
    cwd=$OLDPWD
else
    cwd=$PWD
fi
hpwd="${hpwd% ### *} ### $cwd" # strip off the old ### comment if there was one so they 
                               #   don't accumulate,then build the comment
history -s "$hpwd"             # replace the most recent command with itself plus the comment

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...