鉴于我的 bash 初始化文件之一(.bash_profile 等)中有以下别名:
alias gs='git status'
如何让我的 .bash_history 文件显示替换文本:“git status”而不是别名:“gs”?
答案1
我认为这是不可能的。
我试过这个:
alias foo="echo foo;fc -e /home/hl/tmp/testscript.sh 0"
start cmd:> cat /home/hl/tmp/testscript.sh
#! /bin/bash
set -x
# simple case
#test -f "$1" || exit 1
#echo ": alias replacement : echo foo" >"$1"
# complex case
IFS= read -r line <"$1"
: line: _"$line"_
case "$line" in
foo)
echo ": alias replacement : echo foo" >"$1"
;;
bar)
echo ": alias replacement : echo bar" >"$1"
;;
*)
echo ": alias replacement error" >"$1"
;;
esac
这个想法是:运行实际命令,然后立即纠正命令历史记录,这可以通过bash
内置的fc
.有两个问题:
fc
允许您编辑文件但随后执行它。这可以通过编写虚拟命令(例如 prepend )来部分解决:
。历史记录基于行而不是执行的命令。因此要修改的命令甚至还没有在堆栈上。这可能可以通过一些邪恶的黑客来解决,例如将代码放入
$PS1
但我不想尝试......
历史内置
可能有一种更好的方法可以与上述方法共享“尚未进入堆栈”的问题。我不知道内置的history
.该命令允许写入和读取历史文件。因此可以这样做:
- 写入文件
- 修改文件,例如
sed
:sed -i 's/^gs$/git status/' ~/.bash_history
- 读取文件
历史堆栈问题可以通过这种方式解决(不过我没有尝试):
alias foo="echo foo;(sleep 1; history ...) &"