Bash脚本创建一个文件然后复制它 - 副本有时是空的

时间:2014-01-31 02:13:53

标签: linux bash flush

我在创建bash脚本方面相对缺乏经验。我有一个脚本,其格式如下:

echo "something" >> somefile
echo "somethingelse" >> somefile
rm -f /somepath/somefile
cp somefile /somepath/somefile

这样做是创建一个文件(在实际应用程序中填充了从Web表单提交的数据),然后将该文件复制到/somepath/

有时,新文件的副本为空,但原始副本包含所有echo个数据。

这可能与竞争条件有关,因为在复制操作之前数据可能没有被刷新到文件中吗?

1 个答案:

答案 0 :(得分:2)

如果这是由Web表单提交的,我猜你可以在任何给定时间有多个线程访问你的临时文件。

您回复的文件的 真实 名称是什么?它是唯一的吗?

尝试添加对该文件名唯一的内容,例如可能是进程ID。

您可以使用以下代码获取流程ID:$$

echo "text" >> "tempfile_$$"

这会给你这样的东西:tempfile_1234

甚至可以更好地使用变量:

TEMP_FILE="tempfile_$$"
echo "text" >> $TEMP_FILE
# Do other stuff, copying, etc.
rm $TEMP_FILE