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
    造成的伤害小得多。(我不确定运行
    rm-rf/
    的非root用户是否会做任何事情;我不打算测试它来找出答案。)对单个命令使用
    sudo
    ,而不是作为
    root
    运行shell
  • rm
    视为一个危险的命令。如果键入了
    rm
    命令,请在键入Enter之前重新阅读键入的内容

有关何时使用
别名
以及何时使用
函数
的更多背景信息,请参见您必须以
“rm-rf/”或类似的方式调用它才能使其工作,在这种情况下,您肯定应该得到这条信息。小心使用
rm
的覆盖函数或别名保护自己;有一天你会发现自己没有安全网,然后你犯了一个错误,这真的很痛。如果您想要不同的行为,请编写并使用您自己的
del
delete
remove
命令(函数、别名),该命令可在您认为合适的情况下保护您。如果您试图在缺少自定义代码的计算机上使用它,您仍将受到保护(找不到该命令)。