問題描述
今天寫腳本處理腳本文件的變量肩榕,需要將其中的一個(gè)變量(這里舉例為replaceStr
)替換成另一個(gè)變量匾效。于是寫出了形如這樣的一段代碼:
sed 's~replaceStr~replacedStr~g' replaceFile > replaceFile
當(dāng)然這里具體的工作環(huán)境被代替了。實(shí)際替換了好多個(gè)腳本中的內(nèi)容普筹。
執(zhí)行之后發(fā)現(xiàn)所有的被替換的腳本內(nèi)容都清空了败明。只好再重寫一遍。
問題解決
這個(gè)問題是由于重定向?qū)е碌陌呶摺K赃@里我的處理方案是增加了一個(gè)tmp文件肩刃。寫成了形如:
sed 's~replaceStr~replacedStr~g' replaceFile > tmpFile
mv tmpFile replaceFile
的形式。就可以解決這個(gè)問題了杏头。
或者只要不重定向到本身就好了盈包。可以用如下方法來解決:
sed 's~replaceStr~replacedStr~g' replaceFile | tee replaceFile > /dev/null
將輸出重定向給tee
命令來修改文件醇王。這樣就能避免問題了呢燥。
相關(guān)原理
這里用到了I/O重定向相關(guān)的內(nèi)容。這是我關(guān)于I/O重定向的一些了解寓娩。
但是其實(shí)漏掉了這部分內(nèi)容叛氨。于是在網(wǎng)上找到了這樣的一篇文章shell 十三問。
里面對(duì)于重定向相關(guān)的內(nèi)容很好的解決了這個(gè)問題棘伴。
這個(gè)問題的實(shí)質(zhì)其實(shí)很簡(jiǎn)單寞埠,就是由于重定向的時(shí)候要先準(zhǔn)備好輸入輸出然后才進(jìn)行讀寫操作,所以在sed
讀取replaceFile
中的內(nèi)容之前焊夸,已經(jīng)由于>
操作將這個(gè)文件中的內(nèi)容都清空了仁连。所以最后得到了幾個(gè)被刪光的文件。