太可怕了,差点因为一个命令而失业!!!

版权声明:听说这里让写版权声明~~~ https://blog.csdn.net/f_zyj/article/details/83005255

上周开始用 C M a k e CMake 编译项目,每次编译都需要在 b u i l d / build/ 文件下先,

rm -rf *

清空当前 b u i l d / build/ 文件,然后,

cmake ..

生成了 m a k e make 需要的依赖以后,

make

一下三步,感觉好麻烦的,于是写了一个脚本。

在这里插入图片描述

本来用着都挺好的,可是今天下午一时失误……

在这里插入图片描述

怎么编译不了?找不到 C M a k e L i s t . t x t CMakeList.txt ?哦,原来是没有在 b u i l d build 啊,然后,

cd build

咦,怎么没有 b u i l d / build/ ?这时,我感到了一丝丝不安, l s ls 了一下,发现空空如也,顿时感觉天塌了,我两个月以来辛辛苦苦写的工程代码一下子没了……此时我才意识到我的脚本里的

rm -rf *

是多么危险的存在,这个脚本设定是在 b u i l d / build/ 里执行才行,在其他地方执行就有可能删掉重要的东西,当然就算不写这个脚本,我迟早也会遇见这个情况的,毕竟我平时也是都一股脑 r m rm 的,但是我既然写了脚本,却没有考虑到脚本的健壮性、安全性,这就是在失业的边缘试探啊!!!

一直以为删库跑路是段子,就在那一瞬间,我害怕了,这段子说不定就要发生在我身上了。

就在我抓耳挠腮的时候,我忽然发现命令行提示符还是显示我在 m a s t e r master 上,难道 g i t git 的数据没有被删除?此时我才想到,这个 r m rm 命令应该是无法删除 . . 开头的隐藏文件,不然 . . . . .. 两个文件早就删掉了,并且文件系统也会被破坏掉啊,于是抱着试一试的心态,

ls -la

发现果然有两个 g i t git 文件,一个是 . g i t .git 一个是 . g i t i g n o r e .gitignore ,既然 . g i t .git 还存在,并且我还 c o m m i t commit 了(并没有 p u s h push ),于是乎我查看了 l o g log 找到了上一个状态 r e s e t reset 了一下,得救了。

感谢总管大人,因为就在出问题前,总管大人建议我用 g i t git 在本地管理代码,哪怕不提交也要用 g i t git 管理,这不刚用上 g i t git 我就认识到了 g i t git 的伟大,是 g i t git 救了我一命,让我免于失业。以后不管什么,只要是重要的东西,我都要提醒自己去用 g i t git 管理。

当然,这并没有结束,从这次虚惊一场,我也认识到了写脚本一定得关注脚本的健壮性、安全性,于是下班后并没有回家,而是留下来改写我的脚本。

在这里插入图片描述

这个脚本既然只能在 b u i l d / build/ 文件中执行,我就写了一个判断当前位置是否在 b u l i d / bulid/ 下,如果不是直接终止,并提示,如果是的话,也不直接删除,而是将 r m rm 指令换作 m v mv 指令,因为我的电脑刚好有一个 B i g V BigV 的硬盘闲置着没用存放东西,以后再也不直接 r m rm 了,需要删掉的东西都一律先移动到 B i g V BigV T r a s h Trash 里,然后确定不需要了再删除。当然这样也是麻烦了一些,所以明天需要再写一个定时删除任务,定期自动清理该 T r a s h Trash 里比较老的废弃文件。

嗯,对了,目前只是将这个脚本里的 r m rm m v mv 替代了,但是在别的地方也有需要 r m rm 的时候,同样存在这个风险,所以明天需要再写一个 r m _ s e c u r e rm\_secure 的脚本,以后尽量不用 r m rm 命令,而是用 r m _ s e c u r e rm\_secure 来替代,当然,这个脚本的实现和上述脚本的思想是一样的,用 m v mv 替代,然后结合定时删除任务来进行处理。也就是说 r m rm 命令只在定时删除任务中会直接用到,其他地方均用 m v mv 替代,当然,这样就意味着这两个脚本我都要写的十分健壮安全才行!!!

今天回来家的路上,我又想到,我现在改写的脚本是先判断目录是否正确,不正确直接返回报错,这样不够人性化,不如再修改一下,如果当前目录不是 b u i l d / build/ ,则判断当前目录下有没有 b u i l d / build/ ,有的话直接 c d cd ,没有的话 m k d i r mkdir 后再 c d cd

这次遭遇,真是把自己给活成笑话儿了,一身冷汗,以后再也不敢这么大意了!!!差一点两个月的心血付之东流……现在还是心有余悸。

明天写完脚本后会陆续贴到博客上,欢迎大佬指点一二,帮助我完善脚本~~~


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

猜你喜欢

转载自blog.csdn.net/f_zyj/article/details/83005255
今日推荐