2014-01-31 37 views
0

我在创建bash脚本方面相对缺乏经验。我有一个具有以下形式的脚本:创建文件然后复制它的Bash脚本 - 副本有时为空

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

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

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

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

回答

2

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

什么是real你回应的文件的名称是唯一的吗?

尝试追加一些对该文件名唯一的内容,例如进程ID。

可以使用得到的进程ID:$$

echo "text" >> "tempfile_$$" 

,这将给你这样的事情:tempfile_1234

甚至更​​好,你可以使用一个变量:

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

是它当Web表单被提交或运行时运行?它可能是一个竞赛条件,例如同一个脚本的多个实例? – epx

+0

谢谢。真名永远是一样的;它从来不是唯一的。这听起来很糟糕,这实际上只是一个简单的嵌入式Web服务器,其表单不太可能同时从各种用户访问。我会尝试你的建议 - 非常感谢! – Trevor

+0

您描述的脚本可能无法通过其他方式存在 - 必须覆盖该文件。 – Barmar