我在创建bash脚本方面相对缺乏经验。我有一个脚本,其格式如下:
echo "something" >> somefile
echo "somethingelse" >> somefile
rm -f /somepath/somefile
cp somefile /somepath/somefile
这样做是创建一个文件(在实际应用程序中填充了从Web表单提交的数据),然后将该文件复制到/somepath/
。
有时,新文件的副本为空,但原始副本包含所有echo
个数据。
这可能与竞争条件有关,因为在复制操作之前数据可能没有被刷新到文件中吗?
答案 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