前言
最近在做新項(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)單。
- 在當(dāng)前目錄創(chuàng)建一個(gè)帶有時(shí)間信息的文件夾;
- 進(jìn)入文件夾。
運(yùn)行結(jié)果如下所示:
的確如她所說(shuō),報(bào)錯(cuò)了。報(bào)錯(cuò)信息提示,找不到這個(gè)文件夾。
可是,明明在當(dāng)前目錄生成了同名文件夾。這就奇怪了。
找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è)路徑有啥問(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é)果如下所示。
嘿,驚喜來(lái)了。打印結(jié)果和我想象中不一樣。
理論上應(yīng)該打印如下信息。路徑后的 / 應(yīng)該緊跟路徑才對(duì),怎么會(huì)換行呢?
./XX_20220719-172805/
not exist
定位bug
噢!我知道了,是獲取時(shí)間信息時(shí),遺留下來(lái)的回車符。
my $time=`date '+%Y%m%d-%H%M%S'`;
果然,這里有一個(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í)行了。
后記
其實(shí),現(xiàn)在拿著結(jié)果來(lái)找原因,還是有跡可循的。我們?cè)倩剡^(guò)頭來(lái)看最初的報(bào)錯(cuò)信息。
這里就已經(jīng)展現(xiàn)出一個(gè)回車了,只是混在報(bào)錯(cuò)信息中,不太容易被察覺(jué)到。
總結(jié)思考
在linux操作中很多命令的返回信息都會(huì)帶有回車。如果你也是平時(shí)喜歡在程序中直接調(diào)用linux自帶的命令,那么這個(gè)回車符一定要記得去掉噢。
那么,今天的bug就找到這兒吧,下課~