别名“rm -rf /”=“echo'idiot'”为什么不工作?

时间:2013-12-21 18:19:11

标签: shell alias

我想知道如果“别名”的名称包含带参数的命令怎么办?我试过了:

alias "rm -rf /"="echo 'idiot'"

但它不起作用;什么是正确的方法?

2 个答案:

答案 0 :(得分:7)

你可以这样做:

rm() {
  if [ "$1" = "-rf" ] && [ "$2" = "/" ]; then
    echo 'idiot'
  else
    command rm "$@"
  fi
}

当然它与所有情况都不匹配,但如果需要,可以修改此脚本。

答案 1 :(得分:4)

虽然有人试图这样做,但没有什么好办法可以做到这一点。

别名或函数的名称必须是单个标识符。 rm -rf /被解析为具有两个参数rm-rf的命令/。到那时为止,shell将它与任何其他rm命令区分开来为时已晚。

在某些系统上,默认用户启动脚本配置为将rm别名为rm -i,当然您可以自己执行此操作 - 但由于-f选项会覆盖{{ 1}},在这种情况下没有用。

tcsh shell有一个配置shell变量-i,使它能够识别$rmstar命令并将rm通配符作为参数;如果已设置,则在执行命令之前,shell会提示用户进行确认。当您不小心键入*而非rm * .o时,此功能非常有用。但它没有捕获rm *.o,因为没有通配符。 (如果你没有使用tcsh,这没有用。)请注意,这只能在shell本身完成; rm -rf /命令或其任何替换命令都没有看到rm通配符,它​​只能看到文件名列表。

您可以将*命令替换为阻止您或试图阻止您做某些危险事情的事情。但任何 rm命令都有潜在危险。您可以编写一个rm包装脚本,总是在做任何事情之前提示进行确认,并将其放入,例如rm - 然后您将很快养成习惯在你想要删除某些内容时解除提示。

您可以将$HOME/bin命令替换为指定的文件和/或目录移动到某种“垃圾箱”中,您可以从中轻松恢复它们。但我经常需要运行rm才能恢复磁盘空间。再次,这对rm -rf some-directory没有帮助;这也将删除垃圾箱目录,甚至移动系统文件也会毁了你的一天。

寻找特定命令行选项的解决方案是有限的。专门针对rm -rf /进行检查不会发现rm -rf /rm -fr /rm --force --recursive /,这几乎与rm -rf /etc一样危险。

修改rm -rf /命令行为的任何调整仅在该调整可用时才应用 。如果你设法让rm命令在你自己的环境中更安全,你会依赖它,这可能会让你在另一个环境中(例如,在你的机器上)不那么小心尚未完全设置您的帐户,或出于某种原因使用其他帐户时。)

解决方案是养成良好的习惯

  • 备份您的数据,并确保您实际上能够从备份中恢复文件。 (我自己对此不太满意。)
  • 尽可能少地使用rm帐户。运行root的非root用户所造成的伤害远远低于rm -rf /。 (我不确定运行root的非root用户是否会执行任何;我不打算对其进行测试以找出答案。)对个人使用rm -rf /命令而不是以sudo运行shell。
  • root视为危险的命令。如果您输入了rm命令,请在键入Enter之前重新阅读您键入的内容。