防止用户在 rm 和通配符之间意外输入空格

防止用户在 rm 和通配符之间意外输入空格

意图:

rm -rf string*

问题:

rm -rf string *

第一种情况是 rm 的合法且常见用法,在第二种情况下,一个小的拼写错误可能会导致很多问题。有没有一种简单的方法可以巧妙地防止意外的尾随或前导通配符?

答案1

可以编写一个DEBUG陷阱来取消那些看起来可疑的命令。可以将以下内容或类似代码添加到您的~/.bashrc

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG

根据需要调整逻辑。

(我实际上并不指望这种方法有用——有太多方法会破坏性地弄乱一个命令,而只能逐一进行测试——但它为这个问题提供了一个字面上的答案)。

答案2

没有任何方法可以完全确保系统万无一失。在事情中添加“你确定吗?”提示不仅适得其反,还会导致“我当然确定”的下意识反应。

我几年前从一本书中学到的一个技巧是ls -R blah*,先执行然后 rm -fr blah* 当且仅当 ls 出现的列表符合我想要的内容时才执行。

这很简单,先执行ls命令,然后删除ls -R并替换为rm -fr

最后一个问题是:“如果这些信息对你来说很有价值,那么你的备份在哪里?”

答案3

你能训练自己使用 来代替rmrfrm -rf

如果是这样,这个 bash 函数将让你有机会在确认命令之前查看实际发生的情况:

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }

为了使此功能永久生效,请将此行添加到~/.bashrc您使用的每台计算机上的文件中。

与常见rm别名的比较

定义别名很常见:

alias rm='rm -i'

这有两个限制:

  1. 如果您依赖此别名,那么当您在没有该别名的机器或环境中时,您会大吃一惊。相比之下,尝试在rmrf没有该函数的机器上运行将返回无害的command not found

  2. 这个别名对您没有帮助,因为-f您在命令行上提供的选项会覆盖-i别名中的选项。

答案4

我认为,不必使用两个命令(lsrm),更简单、更轻松的方法是使用find

find . -maxdepth 1 -name "string*" -delete

如果您不小心输入,"string *"它将删除名为string chars和的文件string letters(无论如何这都是您想要的),但它不会像*在 shell 中那样抓取每个文件。

另外,您可以停下来-delete看看要删除哪些文件,然后按向上箭头并输入,这-delete比打字^ls -R^rm -rf或其他废话更容易。

相关内容