記一個(gè)在linux下編程容易被忽視的小bug

前言

最近在做新項(xiàng)目,好久沒(méi)更新博客了。正巧今天朋友問(wèn)了我一個(gè)bug怎么解決,今天就抽空把這個(gè)問(wèn)題記錄一下。

源代碼

由于涉及到公司項(xiàng)目的源碼,我就不貼出她給我看的代碼截圖了。這里我簡(jiǎn)化一下變量,只貼出關(guān)鍵部分。如下所示:

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 : $_";

這段代碼的邏輯很簡(jiǎn)單。

  1. 在當(dāng)前目錄創(chuàng)建一個(gè)帶有時(shí)間信息的文件夾;
  2. 進(jìn)入文件夾。

運(yùn)行結(jié)果如下所示:

記一個(gè)在linux下編程容易被忽視的小bug-1.png

的確如她所說(shuō),報(bào)錯(cuò)了。報(bào)錯(cuò)信息提示,找不到這個(gè)文件夾。

可是,明明在當(dāng)前目錄生成了同名文件夾。這就奇怪了。

記一個(gè)在linux下編程容易被忽視的小bug-2.png

找bug

接下來(lái)就是我找bug的思路。

根據(jù)經(jīng)驗(yàn),我最先想到就是會(huì)不會(huì)在路徑中有空格?因?yàn)槲抑白鲰?xiàng)目有過(guò)類似的經(jīng)歷,路徑中存在空格或存在中文字符的時(shí)候,容易出現(xiàn)一些問(wèn)題。

不過(guò),沒(méi)幾秒鐘我就被啪啪打臉了。因?yàn)檫@個(gè)路徑和文件夾名稱中既沒(méi)有空格,也沒(méi)有中文字符。

用眼睛看,我是看不出有啥問(wèn)題了。只能是來(lái)反向推,一條條的檢查代碼。

  • 首先,我選擇在報(bào)錯(cuò)代碼行的前面打印這個(gè)報(bào)錯(cuò)路徑,然后判斷一下路徑是不是真的不存在。代碼如下所示:
my $rootDir = '.';
my $time=`date '+%Y%m%d-%H%M%S'`;

`mkdir $rootDir/XX_$time`;

# 開(kāi)始檢查
print "$rootDir/XX_$time";
if (-e "$rootDir/XX_$time") {
    print "exist\n";
}else{
    print "not exist\n";
}
# 結(jié)束檢查

chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";

咳,沒(méi)有驚喜,依舊是提示找不到這個(gè)路徑。

記一個(gè)在linux下編程容易被忽視的小bug-3.png
  • 那是不是這個(gè)路徑有啥問(wèn)題呀?我在路徑后面加一個(gè) / 試試。有編程基礎(chǔ)的朋友都知道,在路徑后面加上 /,在大多數(shù)情況下都是沒(méi)有任何影響的。那么,來(lái)試試看。
my $rootDir = '.';
my $time=`date '+%Y%m%d-%H%M%S'`;

`mkdir $rootDir/XX_$time`;

# 開(kāi)始檢查
print "$rootDir/XX_$time/"; # 在路徑結(jié)尾添加一個(gè) /
if (-e "$rootDir/XX_$time") {
    print "exist\n";
}else{
    print "not exist\n";
}
# 結(jié)束檢查

chdir "$rootDir/XX_$time" or die "cannot cd to $rootDir/XX_$time : $_";

運(yùn)行結(jié)果如下所示。

記一個(gè)在linux下編程容易被忽視的小bug-4.png

嘿,驚喜來(lái)了。打印結(jié)果和我想象中不一樣。

理論上應(yīng)該打印如下信息。路徑后的 / 應(yīng)該緊跟路徑才對(duì),怎么會(huì)換行呢?

./XX_20220719-172805/
not exist
記一個(gè)在linux下編程容易被忽視的小bug-5.png

定位bug

噢!我知道了,是獲取時(shí)間信息時(shí),遺留下來(lái)的回車符。

my $time=`date '+%Y%m%d-%H%M%S'`;
記一個(gè)在linux下編程容易被忽視的小bug-6.png

果然,這里有一個(gè)回車。那么bug就找到了。就是這個(gè)地方多了個(gè)回車符,導(dǎo)致路徑不匹配,一直提示“找不到路徑”。

修復(fù)bug

添加一行代碼,對(duì)獲取的時(shí)間變量,去掉其末尾的回車符。

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 : $_";

這樣,程序就順利執(zhí)行了。

記一個(gè)在linux下編程容易被忽視的小bug-7.png

后記

其實(shí),現(xiàn)在拿著結(jié)果來(lái)找原因,還是有跡可循的。我們?cè)倩剡^(guò)頭來(lái)看最初的報(bào)錯(cuò)信息。

記一個(gè)在linux下編程容易被忽視的小bug-8.png

這里就已經(jīng)展現(xiàn)出一個(gè)回車了,只是混在報(bào)錯(cuò)信息中,不太容易被察覺(jué)到。

總結(jié)思考

在linux操作中很多命令的返回信息都會(huì)帶有回車。如果你也是平時(shí)喜歡在程序中直接調(diào)用linux自帶的命令,那么這個(gè)回車符一定要記得去掉噢。

那么,今天的bug就找到這兒吧,下課~


記一個(gè)在linux下編程容易被忽視的小bug-9.jpeg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容