shell脚本中定义路径变量出现的BUG

===========================================================================

if 语句中的定义路径变量 引发命令的PATH路径改变出现的bug 问题

  • 原脚本文件:inotify +rsync 实时共享

#!/bin/bash

PATH=/data/

IP=172.16.1.41

cd $PATH &&\ 切换到一个新的变量中了

/usr/bin/inotifywait -mrq --format '%w%f' -e create,moved_to,close_write,delete $PATH|while read line

do

  if [ -f $line ];then此时的rsync命令就已经不能使用了 (解决方法 绝对路径)/usr/bin/rsync

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  else

    cd $PATH &&\

    rsync -az ./ --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.piassword

  fi

done

===========================================================================

  • sh -x 的验证过程

[root@nfs01 scripts]# vim jiankong2.sh

#cd $PATH &&\

do

  if [ -f $line ];then

    echo 01 在此特别增加了显示内容方便定位到当前变量路径

    echo $PATH

    echo 03

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --

password-file=/etc/rsync.password

  else

    echo 01

    echo $PATH

sh -x 查看过程

[root@nfs01 scripts]# sh -x  jiankong2.sh

+ PATH=/data/

+ IP=172.16.1.41

+ read line

+ /usr/bin/inotifywait -mrq --format %w%f -e create,moved_to

+ '[' -f /data/oldgirl ']'

+ echo 01

01

+ echo /data/  PATH变量的路径转换为/data/ 所以命令会在此读取路径

/data/

+ echo 03

03

+ rsync -az /data/oldgirl --delete rsync_backup@172.16.1.41:

jiankong2.sh: line 13: rsync: command not found 结论:果真报错 命令找不到

+ read line

+ '[' -f /data/oldgirl ']'

+ echo 01

01

+ echo /data/

/data/

+ echo 03

03

+ rsync -az /data/oldgirl --delete rsync_backup@172.16.1.41:

jiankong2.sh: line 13: rsync: command not found  同样的命令找不到

+ read line

===========================================================================

  • 解决方法一 定义变量要和PATH区分开 删除cd 到的变量路径

[root@nfs01 scripts]# cat  jiankong2.sh

#!/bin/bash

WEIZHI=/data/

IP=172.16.1.41

#cd $PATH &&\

/usr/bin/inotifywait -mrq --format '%w%f' -e create,moved_to,close_write,delete $WEIZHI|while read line

do

  if [ -f $line ];then

    rsync -az $line --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  else

  #cd $PATH &&\

    rsync -az $WEIZHI --delete rsync_backup@$IP::nfsbackup --password-file=/etc/rsync.password

  fi

done

===========================================================================

  • 解决方法二

使用绝对路径可以跳出当前定义PATH环境

/usr/bin/rsync

===========================================================================

posted @   王晓冬  阅读(10397)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示