使用终端历史记录时,我可以在执行历史记录中的危险命令时强行确认吗?

时间:2015-10-28 22:29:49

标签: bash shell

我的终端工作流程涉及大量使用UPUPRETURN导航bash历史记录。偶尔我会错误记住或错误输入UP的数量并调用错误的命令。有时它可能有点痛苦(git clone)或非常痛苦(git push)。有一天,我相信我会做一些非常痛苦的事情。

由于这个原因,我发现自己避免使用某些有用但有潜在危险的命令。我可以avoid adding these commands to my history,但我喜欢我的历史。

我想将某些命令(或正则表达式测试)列入黑名单,因此如果我使用我的历史记录调用它们,则需要在执行前进行确认:

$ git status
$ rm -rf node_modules # typed - no confirmation
$ rm -rf node_modules # UP, RETURN - confirmation
Blacklisted command - Are you sure? (yes/no)?

1 个答案:

答案 0 :(得分:1)

使用函数作为命令包装器

shell不直接支持此功能,部分原因是命令在执行之前存储在历史记录中。但是,您可以通过将“危险”命令包装在优先于实际命令的函数中来伪造它。例如:

rm () {
    local regex='[Yy]'
    if history |  sed '$d' | pcregrep -q "^\s+\d+\s+${FUNCNAME} $*"; then
        read -p 'Are you sure? '
        [[ "$REPLY" =~ $regex ]] || return 1
    fi
    command "$FUNCNAME" "$@"
}

秘诀就是sed命令,它删除了刚刚存储在历史记录中的当前命令。没有它,grep将总是在历史记录中找到命令。

注意事项

  1. 请注意使用PCRE支持编译的grep的要求。如果您没有使用PCRE支持编译pcregrep或egrep,则需要调整正则表达式。
  2. 你可能还需要调整引用或使用eval,如果单词拆分没有按照你认为应该的方式发生,但在偶然测试中它对我来说很好。您的里程可能会有所不同。