linux - 我想通过使用 bash 脚本获得 rm 命令过滤器的提示

标签 linux bash rm

几周前,一位高级团队成员意外删除了一个重要的 oracle 数据库文件 (.dbf)。幸运的是,我们可以使用前几天保存的备份文件来恢复系统。

看到这种情况后,我决定实现一个解决方案,以便在提示符下键入 rm 命令时至少进行双重确认。 (检查超过 rm -i)

即使我们将 rm -i 作为默认别名,但超快速的键盘手通常会像那个成员一样犯错误,包括我。

首先,我将(通过使用别名)基本 rm 命令替换为特定的 bash 脚本文件,如果目标与 oracle 数据库路径或文件相关,该脚本文件会多次打印和确认。 简单来说,脚本在运行rm之前作为过滤器运行。如果与oracle无关,rm会正常运行。

在实现过程中,我认为大部分功能都运行良好,因为除了一个问题外,我只期望用户提示环境。

如果在其他脚本(提供的 oracle、其他供应商修改 oracle 路径、安装程序等)或程序(通过使用系统调用)中调用 rm 命令。

  1. 我如何区分这种情况? 如果上面提供的脚本遇到修改过的 rm,该执行将不再继续。

  2. 你有更复杂的方法吗?

相信大部分读者都能看懂我偷懒的解释。 如果您无法从上方看到清晰的风景,请告诉我。我会详细说明。

最佳答案

我们在 man bash 读取:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt.

然后如果您使用alias 使rm 调用您的shell 脚本,其他脚本默认不会使用它。如果这是您想要的,那么您就已经安全了。

问题是如果您希望您的 rm 版本被脚本调用并在它发生时做一些聪明的事情。别名对于前者来说还不够;即使将 rm 放在 $PATH 下的某处,对于显式调用 /bin/rm 的程序来说也是不够的。对于不是 shell 脚本的程序,unlink 系统调用比 system("rm ...") 更可能被使用。

我认为,为了使整个“安全 rm”有用,它应该避免提示,即使是在交互调用时也是如此。每个用户都会养成对它说"is"的习惯,并且没有已知的解决方法。可能有用的方法是将文件移动到回收站而不是删除,从而使损坏易于撤消(我似乎记得,已经准备好为此使用解决方案)。

关于linux - 我想通过使用 bash 脚本获得 rm 命令过滤器的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439126/

相关文章:

java - 将进程作为后台服务运行会导致异常

bash - 用于识别彩色控制台输出的 Shell 脚本

linux - 如何使用 diff (bash) 只显示不同的行

bash - $@ 和 $* 之间的区别

linux - 如何删除以 '-'开头的文件

linux - 如何在开发服务器上执行 rm -rf/* 后恢复服务器上的文件?

linux - 为文件夹树中的每个文件创建符号链接(symbolic link)

c++ - 我可以用 premake 打印最终组装的 gcc 命令吗?

linux - 在 Tomcat 服务器上运行的负载均衡 Sonatype Nexus

linux - 如何删除 linux 代码文件中未使用的文件?