昨天維護的編譯軟件出了一個奇怪的問題,功能大概是這樣的: java
一、下載資源和代碼; linux
二、編譯; windows
三、將須要打包的文件複製到臨時目錄打包。 遞歸
後來因爲新需求,修改了一下功能,在複製到臨時目錄以前還有回去一些資源到臨時目錄: 資源
2.五、下載三方資源到臨時目錄。 編譯
增長此功能後錯誤就出現了,複製的臨時目錄的結構全亂了,好比: 打包
java/bin應複製到temp/bin,結果去錯誤的複製到了temp/bin/bin。 軟件
看到此問題我覺得是2.5步驟中下載的資源包目錄有問題,將功能運行到2.5步中止查看目錄無問題,保留第3步把2.5刪除也無問題,惟獨這些一塊兒運行就有問題,並且windows系統下沒問題,Linux卻有問題。 下載
後來一位前輩想到了問題的緣由,linux系統下面調用了cp命令來複制文件和文件夾,問題就出在這裏。 di
調用的命令 cp -arf srcdir destdir
-a是要複製連接文件,有些生僻,-r遞歸-f強制較常見。
從srcdir到destdir有講究。舉例子來講:
cp -arf java/bin temp/bin 有兩種狀況的複製:
a.複製前 若temp/bin不存在,則將java/bin直接複製到temp,即temp/bin就是java/bin;
b.複製前 若temp/bin存在,則將java/bin複製到temp/bin/中,即temp/bin/bin纔是java/bin。
以前沒有2.5步temp下的bin不存在因此不會有問題,加入2.5步使得bin目錄存在了因此致使複製出錯。
解決方式是這樣複製
cp -arf java/bin temp/
這樣不論怎樣都會正確,注意temp後必定要加/。
另外,windows下使用的是xcopy命令,不會有這樣的問題。