Shell 别名";rm-rf/”字样=&引用;回声&x27;白痴'&引用;为什么不工作?
我想知道如果“别名”的名称中包含一个带参数的命令会怎么样?我试过:Shell 别名";rm-rf/”字样=&引用;回声&x27;白痴'&引用;为什么不工作?,shell,alias,Shell,Alias,我想知道如果“别名”的名称中包含一个带参数的命令会怎么样?我试过: 别名“rm-rf/”=“echo'idiot'” 但它不起作用;正确的方法是什么?您可以这样做: rm() { if [ "$1" = "-rf" ] && [ "$2" = "/" ]; then echo 'idiot' else command rm "$@" fi } 当然,它并不匹配所有的情况,但是如果您愿意,可以修改此脚本。没有真正好的方法可以做到这一点,尽管有人尝试过这
别名“rm-rf/”=“echo'idiot'”
但它不起作用;正确的方法是什么?您可以这样做:
rm() {
if [ "$1" = "-rf" ] && [ "$2" = "/" ]; then
echo 'idiot'
else
command rm "$@"
fi
}
当然,它并不匹配所有的情况,但是如果您愿意,可以修改此脚本。没有真正好的方法可以做到这一点,尽管有人尝试过这样做 别名或函数的名称必须是单个标识符
rm-rf/
被解析为带有两个参数的命令rm
,-rf
和/
。到完成时,shell将其与任何其他rm
命令区分开已经太晚了
在某些系统上,默认用户启动脚本配置为将rm
别名为rm-i
,当然您可以自己执行此操作,但由于-f
选项覆盖-i
,因此在这种情况下没有帮助
tcsh shell有一个配置shell变量$rmstar
,该变量使它能够识别带有*
通配符作为参数的rm
命令;如果设置了,shell将在执行命令之前提示用户进行确认。当您无意中键入rm*.o
而不是rm*.o
时,它很有用。但是它不能捕获rm-rf/
,因为没有通配符。(如果您不使用tcsh,则没有帮助。)请注意,这只能在shell本身中完成;rm
命令或它的任何替代命令都看不到*
通配符,它只看到文件名列表
您可以将rm
命令替换为阻止或试图阻止您做危险事情的命令。但是任何rm
命令都有潜在的危险。您可以编写一个rm
包装器脚本,在执行任何操作之前总是提示确认,然后将其放入,比如说,$HOME/bin
——但是,您很快就会养成在任何时候想要删除某些内容时都会取消提示的习惯
您可以将rm
命令替换为将指定的文件和/或目录移动到某种类型的“垃圾桶”中,您可以轻松地从中恢复它们。但是我经常需要运行rm-rf一些目录
来恢复磁盘空间。同样,这对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
运行shellroot
- 将
视为一个危险的命令。如果键入了rm
命令,请在键入Enter之前重新阅读键入的内容rm
别名
以及何时使用函数
的更多背景信息,请参见您必须以“rm-rf/”或类似的方式调用它才能使其工作,在这种情况下,您肯定应该得到这条信息。小心使用rm
的覆盖函数或别名保护自己;有一天你会发现自己没有安全网,然后你犯了一个错误,这真的很痛。如果您想要不同的行为,请编写并使用您自己的del
或delete
或remove
命令(函数、别名),该命令可在您认为合适的情况下保护您。如果您试图在缺少自定义代码的计算机上使用它,您仍将受到保护(找不到该命令)。