美文网首页
记一个在linux下编程容易被忽视的小bug

记一个在linux下编程容易被忽视的小bug

作者: 潘高PG | 来源:发表于2022-07-19 18:44 被阅读0次

    前言

    最近在做新项目,好久没更新博客了。正巧今天朋友问了我一个bug怎么解决,今天就抽空把这个问题记录一下。

    源代码

    由于涉及到公司项目的源码,我就不贴出她给我看的代码截图了。这里我简化一下变量,只贴出关键部分。如下所示:

    my $rootDir = '.';
    my $time=`date '+%Y%m%d-%H%M%S'`;
    
    `mkdir $rootDir/XX_$time`;
    
    chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";
    

    这段代码的逻辑很简单。

    1. 在当前目录创建一个带有时间信息的文件夹;
    2. 进入文件夹。

    运行结果如下所示:

    记一个在linux下编程容易被忽视的小bug-1.png

    的确如她所说,报错了。报错信息提示,找不到这个文件夹。

    可是,明明在当前目录生成了同名文件夹。这就奇怪了。

    记一个在linux下编程容易被忽视的小bug-2.png

    找bug

    接下来就是我找bug的思路。

    根据经验,我最先想到就是会不会在路径中有空格?因为我之前做项目有过类似的经历,路径中存在空格或存在中文字符的时候,容易出现一些问题。

    不过,没几秒钟我就被啪啪打脸了。因为这个路径和文件夹名称中既没有空格,也没有中文字符。

    用眼睛看,我是看不出有啥问题了。只能是来反向推,一条条的检查代码。

    • 首先,我选择在报错代码行的前面打印这个报错路径,然后判断一下路径是不是真的不存在。代码如下所示:
    my $rootDir = '.';
    my $time=`date '+%Y%m%d-%H%M%S'`;
    
    `mkdir $rootDir/XX_$time`;
    
    # 开始检查
    print "$rootDir/XX_$time";
    if (-e "$rootDir/XX_$time") {
        print "exist\n";
    }else{
        print "not exist\n";
    }
    # 结束检查
    
    chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";
    

    咳,没有惊喜,依旧是提示找不到这个路径。

    记一个在linux下编程容易被忽视的小bug-3.png
    • 那是不是这个路径有啥问题呀?我在路径后面加一个 / 试试。有编程基础的朋友都知道,在路径后面加上 /,在大多数情况下都是没有任何影响的。那么,来试试看。
    my $rootDir = '.';
    my $time=`date '+%Y%m%d-%H%M%S'`;
    
    `mkdir $rootDir/XX_$time`;
    
    # 开始检查
    print "$rootDir/XX_$time/"; # 在路径结尾添加一个 /
    if (-e "$rootDir/XX_$time") {
        print "exist\n";
    }else{
        print "not exist\n";
    }
    # 结束检查
    
    chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";
    

    运行结果如下所示。

    记一个在linux下编程容易被忽视的小bug-4.png

    嘿,惊喜来了。打印结果和我想象中不一样。

    理论上应该打印如下信息。路径后的 / 应该紧跟路径才对,怎么会换行呢?

    ./XX_20220719-172805/
    not exist
    
    记一个在linux下编程容易被忽视的小bug-5.png

    定位bug

    噢!我知道了,是获取时间信息时,遗留下来的回车符。

    my $time=`date '+%Y%m%d-%H%M%S'`;
    
    记一个在linux下编程容易被忽视的小bug-6.png

    果然,这里有一个回车。那么bug就找到了。就是这个地方多了个回车符,导致路径不匹配,一直提示“找不到路径”。

    修复bug

    添加一行代码,对获取的时间变量,去掉其末尾的回车符。

    my $rootDir = '.';
    my $time=`date '+%Y%m%d-%H%M%S'`;
    
    chomp $time; # 去掉末尾的回车符
    
    `mkdir $rootDir/XX_$time`;
    
    chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";
    

    这样,程序就顺利执行了。

    记一个在linux下编程容易被忽视的小bug-7.png

    后记

    其实,现在拿着结果来找原因,还是有迹可循的。我们再回过头来看最初的报错信息。

    记一个在linux下编程容易被忽视的小bug-8.png

    这里就已经展现出一个回车了,只是混在报错信息中,不太容易被察觉到。

    总结思考

    在linux操作中很多命令的返回信息都会带有回车。如果你也是平时喜欢在程序中直接调用linux自带的命令,那么这个回车符一定要记得去掉噢。

    那么,今天的bug就找到这儿吧,下课~


    记一个在linux下编程容易被忽视的小bug-9.jpeg

    相关文章

      网友评论

          本文标题:记一个在linux下编程容易被忽视的小bug

          本文链接:https://www.haomeiwen.com/subject/hmdsirtx.html