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

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

上周开始用 CMakeCMake 编译项目,每次编译都需要在 build/build/ 文件下先,

rm -rf *

清空当前 build/build/ 文件,然后,

cmake ..

生成了 makemake 需要的依赖以后,

make

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

在这里插入图片描述

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

在这里插入图片描述

怎么编译不了?找不到 CMakeList.txtCMakeList.txt?哦,原来是没有在 buildbuild 啊,然后,

cd build

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

rm -rf *

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

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

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

ls -la

发现果然有两个 gitgit 文件,一个是 .git.git 一个是 .gitignore.gitignore,既然 .git.git 还存在,并且我还 commitcommit 了(并没有 pushpush),于是乎我查看了 loglog 找到了上一个状态 resetreset 了一下,得救了。

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

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

在这里插入图片描述

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

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

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

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

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


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
阅读更多

扫码向博主提问

f_zyj

弱校 ACM 竞赛拓荒者,从零到区域赛银
  • 擅长领域:
  • ACM
  • 挑战程序设计
  • C/C++
去开通我的Chat快问
换一批

没有更多推荐了,返回首页