好了,你可以用把自己的路組件之一中的所有其他人面前的由來已久的做法:
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