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

简介: 今天就来聊聊 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 -u 
b=
echo $b
echo $a
echo 1
# bash a.sh
a.sh: line 4: a: unbound variable


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


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


微信图片_20220414214309.jpg


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


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


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


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


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


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


微信图片_20220414214440.jpg

微信图片_20220414214459.jpg

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


(1)使用逻辑短路操作

cd path && rm -rf *.exe


(2)检测 path 是否存在

[[ -d ~ ]] && echo 1

1


5、终极解决方案

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


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

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


微信图片_20220414214911.jpg

微信图片_20220414214914.jpg


OK,本文到此就结束了,列举了一些常见的case和解决方案,希望能对大家有所启发



目录
相关文章
|
5天前
|
存储 缓存 Linux
Linux 根目录下的目录都是什么作用
【6月更文挑战第22天】Linux 根目录下的目录都是什么作用
140 56
|
10天前
|
安全 Shell Linux
探索Linux命令chsh:更改用户的默认shell
`chsh`是Linux命令,用于更改用户的默认登录shell。它涉及用户环境配置和系统安全,允许用户选择更适合自己的shell以提升效率。命令有交互式选项和参数如`-s`来指定新shell。在使用时要注意新shell的可执行性、权限问题及选择合适的shell。例如,要更改为bash,用户可运行`chsh`后按提示操作,而root用户能用`sudo chsh -s /bin/zsh john`为用户`john`设定zsh。在更改前,确认shell路径、权限,并了解不同shell的特点。
|
10天前
|
存储 Linux 数据库
【Linux】Linux基础文件与目录管理:成为Linux大师的入门必修课
【Linux】Linux基础文件与目录管理:成为Linux大师的入门必修课
21 3
|
10天前
|
监控 Shell Linux
Linux的Shell脚本详解
Linux的Shell脚本详解
|
13天前
|
Linux 开发工具
【Linux文本编辑艺术】:从入门到熟练,Vim大师之路揭秘
【Linux文本编辑艺术】:从入门到熟练,Vim大师之路揭秘
|
13天前
|
Linux Unix Windows
【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)
【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)
|
17小时前
|
机器学习/深度学习 Unix Java
技术笔记:Linux之Shell脚本编程(一)
技术笔记:Linux之Shell脚本编程(一)
|
1天前
|
Shell Linux
【linux】进程替换的应用|shell解释器的实现
【linux】进程替换的应用|shell解释器的实现
7 0
|
7天前
|
Unix Linux 程序员
linux入门系列4--vi/vim编辑器
linux入门系列4--vi/vim编辑器
|
1月前
|
监控 网络协议 Java
Linux 网络编程从入门到进阶 学习指南
在上一篇文章中,我们探讨了 Linux 系统编程的诸多基础构件,包括文件操作、进程管理和线程同步等,接下来,我们将视野扩展到网络世界。在这个新篇章里,我们要让应用跳出单机限制,学会在网络上跨机器交流信息。
Linux 网络编程从入门到进阶 学习指南