好了,你可以用把自己的路组件之一中的所有其他人面前的由来已久的做法:
PATH=~/safebin:$PATH
,然后在~/safebin
,你把那些“更安全”的脚本像rm
:
#!/bin/bash
for fspec in "[email protected]" ; do
if [[ "${fspec: -3}" = ".py" ]] ; then
echo Not removing ${fspec}, use /bin/rm if you really want to.
else
echo Would /bin/rm "${fspec}" but for paranoia.
fi
done
为rm *
该脚本输出:
Would /bin/rm chk.sh but for paranoia.
Would /bin/rm go but for paranoia.
Would /bin/rm go.sh but for paranoia.
Would /bin/rm images but for paranoia.
Would /bin/rm images_renamed but for paranoia.
Would /bin/rm infile.txt but for paranoia.
Would /bin/rm jonesforth.S but for paranoia.
Would /bin/rm jonesforth.f but for paranoia.
Would /bin/rm mycode.f but for paranoia.
Would /bin/rm num1.txt but for paranoia.
Would /bin/rm num2 but for paranoia.
Would /bin/rm num2.txt but for paranoia.
Would /bin/rm proc.pl but for paranoia.
Would /bin/rm qq but for paranoia.
Would /bin/rm qq.c but for paranoia.
Would /bin/rm qq.cpp but for paranoia.
Would /bin/rm qq.in but for paranoia.
Not removing qq.py, use /bin/rm if you really want to.
Would /bin/rm qq.rb but for paranoia.
Would /bin/rm qq.s but for paranoia.
Would /bin/rm qq1 but for paranoia.
Would /bin/rm qq2 but for paranoia.
Would /bin/rm qqq but for paranoia.
Would /bin/rm rm but for paranoia.
Would /bin/rm source.f90 but for paranoia.
Would /bin/rm test.txt but for paranoia.
Would /bin/rm xx but for paranoia.
Not removing xx.py, use /bin/rm if you really want to.
现在显然"${fspec: -3}" = ".py"
是一个简单的和黑名单。我可能更喜欢有一个白名单,我被允许删除并拒绝其他一切。
下面是基于正则表达式白名单版本:
#!/bin/bash
for fspec in "[email protected]" ; do
del=0
if [[ ! -z "$(echo "${fspec}" | grep 'a.e')" ]] ; then
del=1
fi
if [[ ! -z "$(echo "${fspec}" | grep '\.[Ss]$')" ]] ; then
del=1
fi
if [[ ${del} -ne 1 ]] ; then
echo "Not removing ${fspec}, use /bin/rm if you want."
else
echo " Removing ${fspec}"
#/bin/rm "${fspec}
fi
done
,输出:
Not removing chk.sh, use /bin/rm if you want.
Not removing go, use /bin/rm if you want.
Not removing go.sh, use /bin/rm if you want.
Removing images
Removing images_renamed
Not removing infile.txt, use /bin/rm if you want.
Removing jonesforth.S
Not removing jonesforth.f, use /bin/rm if you want.
Not removing mycode.f, use /bin/rm if you want.
Not removing num1.txt, use /bin/rm if you want.
Not removing num2, use /bin/rm if you want.
Not removing num2.txt, use /bin/rm if you want.
Not removing proc.pl, use /bin/rm if you want.
Not removing qq, use /bin/rm if you want.
Not removing qq.c, use /bin/rm if you want.
Not removing qq.cpp, use /bin/rm if you want.
Not removing qq.in, use /bin/rm if you want.
Not removing qq.py, use /bin/rm if you want.
Not removing qq.rb, use /bin/rm if you want.
Removing qq.s
Not removing qq1, use /bin/rm if you want.
Not removing qq2, use /bin/rm if you want.
Not removing qqq, use /bin/rm if you want.
Not removing rm, use /bin/rm if you want.
Not removing source.f90, use /bin/rm if you want.
Not removing test.txt, use /bin/rm if you want.
Not removing xx, use /bin/rm if you want.
Not removing xx.py, use /bin/rm if you want.
注意,它是一个扩展的通配符的外壳,让你的程序或功能将永远不会真正*参见*'* .py'。它会看到的所有内容都是通过匹配'* .py'的结果,即匹配该模式的文件列表。 (或者,如果没有,则为'* .py';如果为'shopt -s nullglob',则为空字符串。) – janmoesen 2010-08-18 11:39:41
依赖同名替换来替代'rm'等东西是个坏主意。它所需要的只是一次不可用而Bam!你的文件不见了,因为安全网不在那里。如果你想使用网络,你应该使用不同的名称(例如“安全”)。 – 2010-08-18 15:26:53
@Dennis Williamson:对,你说得对,使用不同的名字可能会更好,但实际上并不是因为你的原因(至少如果你使用你的“rm”命令就像原来的那样(没有直接利用“rm *不删除我的源代码,所以我总是可以使用它“))。但问题可能是更多的Makefiles或安装脚本,不知道你的“RM”不是一个标准的,你可以创造巨大的副作用... – ThR37 2010-08-19 08:36:58