上周开始用 编译项目,每次编译都需要在 文件下先,
rm -rf *
清空当前 文件,然后,
cmake ..
生成了 需要的依赖以后,
make
一下三步,感觉好麻烦的,于是写了一个脚本。
本来用着都挺好的,可是今天下午一时失误……
怎么编译不了?找不到 ?哦,原来是没有在 啊,然后,
cd build
咦,怎么没有 ?这时,我感到了一丝丝不安, 了一下,发现空空如也,顿时感觉天塌了,我两个月以来辛辛苦苦写的工程代码一下子没了……此时我才意识到我的脚本里的
rm -rf *
是多么危险的存在,这个脚本设定是在 里执行才行,在其他地方执行就有可能删掉重要的东西,当然就算不写这个脚本,我迟早也会遇见这个情况的,毕竟我平时也是都一股脑 的,但是我既然写了脚本,却没有考虑到脚本的健壮性、安全性,这就是在失业的边缘试探啊!!!
一直以为删库跑路是段子,就在那一瞬间,我害怕了,这段子说不定就要发生在我身上了。
就在我抓耳挠腮的时候,我忽然发现命令行提示符还是显示我在 上,难道 的数据没有被删除?此时我才想到,这个 命令应该是无法删除 开头的隐藏文件,不然 和 两个文件早就删掉了,并且文件系统也会被破坏掉啊,于是抱着试一试的心态,
ls -la
发现果然有两个 文件,一个是 一个是 ,既然 还存在,并且我还 了(并没有 ),于是乎我查看了 找到了上一个状态 了一下,得救了。
感谢总管大人,因为就在出问题前,总管大人建议我用 在本地管理代码,哪怕不提交也要用 管理,这不刚用上 我就认识到了 的伟大,是 救了我一命,让我免于失业。以后不管什么,只要是重要的东西,我都要提醒自己去用 管理。
当然,这并没有结束,从这次虚惊一场,我也认识到了写脚本一定得关注脚本的健壮性、安全性,于是下班后并没有回家,而是留下来改写我的脚本。
这个脚本既然只能在 文件中执行,我就写了一个判断当前位置是否在 下,如果不是直接终止,并提示,如果是的话,也不直接删除,而是将 指令换作 指令,因为我的电脑刚好有一个 的硬盘闲置着没用存放东西,以后再也不直接 了,需要删掉的东西都一律先移动到 的 里,然后确定不需要了再删除。当然这样也是麻烦了一些,所以明天需要再写一个定时删除任务,定期自动清理该 里比较老的废弃文件。
嗯,对了,目前只是将这个脚本里的 用 替代了,但是在别的地方也有需要 的时候,同样存在这个风险,所以明天需要再写一个 的脚本,以后尽量不用 命令,而是用 来替代,当然,这个脚本的实现和上述脚本的思想是一样的,用 替代,然后结合定时删除任务来进行处理。也就是说 命令只在定时删除任务中会直接用到,其他地方均用 替代,当然,这样就意味着这两个脚本我都要写的十分健壮安全才行!!!
今天回来家的路上,我又想到,我现在改写的脚本是先判断目录是否正确,不正确直接返回报错,这样不够人性化,不如再修改一下,如果当前目录不是 ,则判断当前目录下有没有 ,有的话直接 ,没有的话 后再 。
这次遭遇,真是把自己给活成笑话儿了,一身冷汗,以后再也不敢这么大意了!!!差一点两个月的心血付之东流……现在还是心有余悸。
明天写完脚本后会陆续贴到博客上,欢迎大佬指点一二,帮助我完善脚本~~~
2018.10.12 更新
build-run 脚本
#!/bin/bash
# build and run project
# Warning: Must be in the Build directory!!!
CURRENT_PATH=`pwd`
CURRENT_DIRECTORY="${CURRENT_PATH##*/}"
is_empty_dir()
{
echo `ls -A | wc -w`
}
if [ ${CURRENT_DIRECTORY} != "build" ]; then
cd build
if [ $? -ne 0 ]; then
mkdir build
cd build
fi
echo
echo Warning: Must be in the build/ directory!!!
echo
fi
CURRENT_PATH=`pwd`
CURRENT_DIRECTORY="${CURRENT_PATH##*/}"
pwd
if [ `is_empty_dir` -ne 0 ]; then
trash_path="/media/f_zyj/BigV/Trash/${CURRENT_DIRECTORY}_`date +%Y-%m-%d_%k:%M:%S`/"
mkdir ${trash_path}
mv ./* ${trash_path}
fi
if [ $? -ne 0 ]; then
echo
echo ERROR: The First Step Failed!
echo
exit 1
fi
cmake ..
if [ $? -ne 0 ]; then
echo
echo ERROR: The Second Step Failed!
echo
exit 2
fi
make
if [ $? -ne 0 ]; then
echo
echo ERROR: The Third Step Failed!
echo
exit 3
fi
echo done!
exit 0