问题描述
今天写脚本处理脚本文件的变量,需要将其中的一个变量(这里举例为replaceStr
)替换成另一个变量。于是写出了形如这样的一段代码:
sed 's~replaceStr~replacedStr~g' replaceFile > replaceFile
当然这里具体的工作环境被代替了。实际替换了好多个脚本中的内容。
执行之后发现所有的被替换的脚本内容都清空了。只好再重写一遍。
问题解决
这个问题是由于重定向导致的。所以这里我的处理方案是增加了一个tmp文件。写成了形如:
sed 's~replaceStr~replacedStr~g' replaceFile > tmpFile
mv tmpFile replaceFile
的形式。就可以解决这个问题了。
或者只要不重定向到本身就好了。可以用如下方法来解决:
sed 's~replaceStr~replacedStr~g' replaceFile | tee replaceFile > /dev/null
将输出重定向给tee
命令来修改文件。这样就能避免问题了。
相关原理
这里用到了I/O重定向相关的内容。这是我关于I/O重定向的一些了解。
但是其实漏掉了这部分内容。于是在网上找到了这样的一篇文章shell 十三問。
里面对于重定向相关的内容很好的解决了这个问题。
这个问题的实质其实很简单,就是由于重定向的时候要先准备好输入输出然后才进行读写操作,所以在sed
读取replaceFile
中的内容之前,已经由于>
操作将这个文件中的内容都清空了。所以最后得到了几个被删光的文件。