bash中PROMPT_COMMAND获取上一条执行命令的内置实现方法
解决方案
BASH_COMMAND变量无法满足需求的原因是它存储的是当前正在执行的命令,在PROMPT_COMMAND执行阶段,它的值就是PROMPT_COMMAND本身的内容,自然拿不到触发提示符更新的上一条业务命令。
你可以使用bash内置的fc命令实现需求,完全不需要调用外部工具和管道,性能远高于你当前的history管道实现:
function bash_prompt_command () { ... # 临时清空HISTTIMEFORMAT避免输出时间前缀,fc参数说明: # -l 列出历史命令 # -n 不输出历史行号 # -1 只取最近1条历史(即PROMPT_COMMAND触发前执行的最后一条命令) local last_cmd="$(HISTTIMEFORMAT= fc -ln -1)" # 去除返回结果首尾的空白字符(fc默认返回内容带前导空格) shopt -s extglob last_cmd=${last_cmd##*([[:space:]])} last_cmd=${last_cmd%%*([[:space:]])} shopt -u extglob [[ ${last_cmd} =~ .*git\s+checkout.* ]] && ( ... ) ... }
注意事项
- 确保交互式bash的历史功能已开启(默认状态就是开启的,对应配置为
set -o history) - 如果你在
PROMPT_COMMAND中有主动写入历史的逻辑(比如history -a同步历史到文件),请把获取last_cmd的逻辑放在写历史操作之前,避免误取到PROMPT_COMMAND内部执行的命令。
内容的提问来源于stack exchange,提问作者hardeep
相关产品推荐
相关产品推荐

