在将其存储在bash历史记录中之前清理命令

时间:2017-03-03 03:31:29

标签: bash

由于Ctrl-R搜索不完整rm -rf并且rm -rf foo我需要的文件意外地运行了错误的命令,它让我思考。

有没有办法清理{b}历史记录中保存rm -r foo rm? 这将确保如果将来意外运行该命令,它将在此之前询问 我的rm -iv别名为rm -r,因此我认为此操作会在不询问的情况下停止rm -r删除(我承认在没有-i标记的情况下我没有运行mkdir foo cd !$

我认为这是可能的原因是基于bash bang builtins。

mkdir foo
cd foo

将在bash历史中显示:

{{1}}

编辑:虽然我很感激“不要在历史上拯救”#34;解决方案,我知道它,特别想要一个不同的解决方案,正如@tripleee解释的那样。

1 个答案:

答案 0 :(得分:3)

我不确定这是多么万无一失;它可能会错过提供-f选项的某种方式。也就是说,您可以使用以下内容覆盖rm

rm () {
  local HISTIGNORE="$HISTIGNORE:command rm *"
  local arg process
  local -a sanitized
  command rm "$@"
  process=true
  for arg in "$@"; do
    if [[ $process && $arg = -*f* ]]; then
      sanitized+=("${arg//f/}")
    elif [[ $arg == -- ]]; then
      process=
    else
      sanitized+=("$arg")
    fi
  done
  history -s rm "${sanitized[@]}"
}

其工作原理如下:

  1. 暂时将模式command rm *添加到HISTIGNORE列表中,以便将要执行的命令添加到历史记录中。
  2. 按要求执行命令。
  3. 浏览参数,查找包含-f选项的任何参数。 (独立或短群选项。)任何此类单词都应删除f。已清理的单词将添加到新数组中。
  4. history -s命令将重建的命令(带有清理的参数)添加到历史列表中。