我想保存当前目录中的每个命令发出的历史记录中的命令。为了不乱糟糟,我正在考虑添加当前目录作为注释在行尾。一个例子可能有帮助:
$ cd /usr/local/wherever $ grep timmy accounts.txt
我想bash保存最后一个命令为:
grep timmy accounts.txt # /usr/local/wherever
想法是这样我可以立即看到我发出命令的地方。
单线版本
这是一个单线版本。这是原来的。我还发布了一个短功能版本和一个长功能版本,增加了几个功能。我喜欢的功能版本,因为他们不会打扰你的环境中的其他变量,它们比一行程序更可读。这篇文章有一些信息,他们如何所有的工作,可能不会在其他人重复。
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