专栏首页数据之美Linux Shell 从入门到删除根目录跑路指南

Linux Shell 从入门到删除根目录跑路指南

shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭口之利器~

今天就来聊聊 linux 下一个常见的问题:如何避免误删目录。下文会详细的讲述不同的场景下误删目录,以及相应的解决方案。

1、变量为空导致误删文件

base_path=/usr/sbin
tmp_file=`cmd_invalid`
# rm -rf $base_path/$tmp_file

这种情况下如果 cmd 执行出错或者返回为空,后果将是灾难性的,那如何防范呢?

(1)利用 shell 的变量扩展功能,如果变量为空赋给默认值或者抛出异常退出脚本:

echo ${base_path:?var is empty}/${tmp_file:?var is empty}
-bash: tmp_file: var is empty

(2)人肉判断变量是否为空:

[[ ${tmp_file} == "" ]] && echo 1
1
[[ -z ${tmp_file} ]] && echo 1       
1

(3)如果变量未定义还可以开启 set 选项:

# cat a.sh
# 若有用未设置的变量即让脚本退出执行
# set -o nounset
# 或
set -u
b=
echo $b
echo $a
echo 1

# bash a.sh

a.sh: line 4: a: unbound variable

# 另外,
# 如果命令运行失败让脚本退出执行
set -o errexit 
# 或
set -e

2、路径含有空格导致误删文件

史上最经典的要数下面这个bumblebee项目了,这个项目本来不出名,不过,程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目。

那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

path="/usr/local /sbin"
# rm -rf $path
rm -rf "$path"

(2)对变量进行语义检查

比如检测是否含有空格等特殊字符,不通用,不推荐这么做

3、目录或文件含有特殊字符导致误删文件

ll
总用量 8
drwxrwxr-x 2 work work 4096 11月 24 18:57 '~'
-rw-rw-r-- 1 work work   34 11月 24 19:49 a.sh

# rm -rf ~

那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

rm -rf "~"

(2)如果不确定,删除之前 echo 或 find 一下,看变量被扩展成啥了

echo rm -rf "~"
rm -rf ~

echo rm -rf ~ 
rm -rf /home/work

4、cd 切换目录失败,导致文件被误删

cd ooxx_path_not_exsit
rm -rf *.exe

恭喜这种情况下你的当前目录下匹配文件都会被误删,那我们该如何防范这种问题呢?

(1)使用逻辑短路操作

cd path && rm -rf *.exe

(2)检测 path 是否存在

[[ -d ~ ]] && echo 1
1

5、终极解决方案

不要使用 root 操作系统资源,这样至少不会删除系统文件。

6、在登录 shell 下使用友好的提示符

友好的命令提示符能时刻提醒操作者当前在哪个路径下,避免错误的路径下操作文件。

OK,本文到此就结束了,列举了一些常见的case和解决方案,希望能对大家有所启发,如果有其他的 case 和建议也欢迎交流~

Refer:

[1] Bash 脚本 set 命令教程

http://www.ruanyifeng.com/blog/2017/11/bash-set.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux Shell从入门到删除根目录跑路指南

    shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭...

    小小科
  • Linux Shell从入门到删除根目录跑路指南

    三哥
  • Linux Shell从入门到删除根目录跑路指南

    shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭...

    三哥
  • Linux Shell从入门到删除根目录跑路指南

    shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭...

    三哥
  • Linux Shell 从入门到删除根目录跑路指南

    shell 作为一门 linux 下使用广泛的系统语言,语法简单,上手容易,但是想要用好,少犯错误,也不是那么容易的一件事,可谓虽是居家旅行之良药,但也是杀人灭...

    用户6543014
  • 如何在CentOS 7上安装PostgreSQL关系数据库

    PostgreSQL关系数据库系统是一个功能强大的,可扩展的,并符合标准的开源数据库平台。本指南将帮助您在CentOS 7 Linode上安装和配置Postgr...

    沈唁
  • 机器学习程序猿在Linux猩球的生存指南

    一个小程序猿,在一场飞行意外中,坠落到Linux猩球,与家乡Win猩球/Mac猩球的绚丽多彩不同的是:Linux猩球大部分时间都是处于黑暗之中[命令行/Shel...

    流川枫
  • 运维管理之防止"rm -rf /" 误删除

    大概懂点linux的程序员都知道“rm -rf /”意味着擦除根路径“/”下挂载的所有内容而无需询问。以前一个主管说过,在你不充分了解某个工具的原理的时候,不要...

    lyb-geek
  • 计算机教育中缺失的一课

    上一篇「终于制服了它们」把命令行、终端、Shell 搞清楚后,今天这篇写起来就顺畅多了。哦,极度的舒适!

    沉默王二

扫码关注云+社区

领取腾讯云代金券