【问题标题】:When using the terminal history, can I force confirmation when executing dangerous commands from my history?使用终端历史记录时,我可以在执行历史记录中的危险命令时强制确认吗?
【发布时间】:2015-10-28 22:29:48
【问题描述】:

我的终端工作流程涉及大量使用 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)?

【问题讨论】:

  • 仅来自历史?否 - 在执行时,没有可用的标志来指示命令是从历史中检索还是直接执行,因此无法执行条件逻辑。

标签: bash shell


【解决方案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 命令,它去除了刚刚存储在历史记录中的 current 命令。没有它,grep 将总是在历史记录中找到该命令。

注意事项

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

【讨论】:

  • 很好,它也适用于我。我在 OSX El Capitan 10.11 上要做的就是添加 PCRE 支持 (brew install pcre)
  • 我认为你可以用 history -p !?${FUNCNAME} $*?:q 2> /dev/null 替换整个管道。
猜你喜欢
  • 2011-10-01
  • 2013-08-17
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2017-06-06
  • 2020-02-22
  • 2015-09-19
  • 2021-10-02
相关资源
最近更新 更多