我想知道如果“别名”的名称包含带参数的命令怎么办?我试过了:
alias "rm -rf /"="echo 'idiot'"
但它不起作用;什么是正确的方法?
答案 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之前重新阅读您键入的内容。