当前位置: 首页 > news >正文

linux执行应用程序或者shell脚本关于污不污染的问题

linux执行应用程序或者shell脚本关于污不污染的问题

先贴脚本:
 
bash
 
运行
 
 
 
# 业务脚本:处理数据
cd /data/backup
rm -rf *.log
TMP_FILE="tmp.tmp"
 
 

 

第一行:# 业务脚本:处理数据

 
# 开头,是注释,Shell 直接忽略,只是给人看说明用的。
 

 

第二行:cd /data/backup

 
bash
 
运行
 
 
 
cd /data/backup
 
 
  • cd = 切换当前工作目录
  • 作用:进入 /data/backup 这个文件夹
 

关键重点

 
如果用 source / . 执行脚本:
 
你自己的终端当前目录,会直接被切到 /data/backup
 
你本来在家目录,跑完脚本直接被拐到别的目录,这就是污染环境。
 
如果用 ./hello.sh 子 Shell 执行:
 
只在子进程里切目录,你终端原地不动。
 

 

第三行:rm -rf *.log

 
bash
 
运行
 
 
 
rm -rf *.log
 
 
拆解:
 
  • rm:删除文件
  • -r:递归删文件夹
  • -f:强制删除,不提示、不报错
  • *.log:匹配所有以 .log 结尾的文件
 
整句意思:
 
强制删掉当前目录下所有 .log 日志文件
 

风险点

 
配合上面 cd /data/backup,就是:
 
进到备份目录,把所有日志全清掉。
 
本身是正常业务清理逻辑,但如果是 source 跑,你目录被切走,后续误操作很危险。
 

 

第四行:TMP_FILE="tmp.tmp"

 
bash
 
运行
 
 
 
TMP_FILE="tmp.tmp"
 
 
定义一个自定义变量:
 
变量名 TMP_FILE,值是 tmp.tmp
 

区别

 
  1. 用 source 执行
     
    这个变量会留在你当前终端里,你后面随便敲:
 
bash
 
运行
 
 
 
echo $TMP_FILE
 
 
能打印出 tmp.tmp,平白多了一个没用的变量,污染当前 Shell 环境。
 
  1. 用 ./ 子 Shell 执行
     
    变量只在子进程里有效,脚本一结束,变量直接消失,完全不影响你当前终端。
 

 

整体合起来翻译

 
这个脚本做三件事:
 
  1. 注释说明:这是处理数据的业务脚本
  2. 进入 /data/backup 目录
  3. 删掉里面所有 .log 日志文件
  4. 定义一个临时文件名变量 TMP_FILE
 

 

回到你最开始的疑问:什么叫「污染当前环境」

 
就这三方面污染:
 
  1. 把你终端工作目录强行改掉(cd 导致)
  2. 在你终端残留多余自定义变量(TMP_FILE 导致)
  3. 后续你敲命令,可能因为目录变了、变量乱了,误删、误操作
 
所以普通业务脚本绝对不能用 source 跑,要用 ./xxx.sh 开子进程隔离,干完就销毁,不影响你当前终端。