Linux 将输出附加到文件时出现奇怪的错误
我有一个奇怪的错误,当在bash中追加到文件时,文本被删除,即使我告诉它追加 我有一个bash脚本,我在其中执行以下操作Linux 将输出附加到文件时出现奇怪的错误,linux,bash,append,Linux,Bash,Append,我有一个奇怪的错误,当在bash中追加到文件时,文本被删除,即使我告诉它追加 我有一个bash脚本,我在其中执行以下操作 echo "Run program" > foo.txt ./fortran_program >> foo.txt fortran_程序(一个精简版本,提供相同的结果)是: 这将使我在执行后在foo.txt中运行程序AB。但是我发现运行B,因此原始文本已被覆盖,而A不包括在内 我做了strace-f./script,发现以下输出看起来很相关: ... [p
echo "Run program" > foo.txt
./fortran_program >> foo.txt
fortran_程序(一个精简版本,提供相同的结果)是:
这将使我在执行后在foo.txt中运行程序AB。但是我发现运行B
,因此原始文本已被覆盖,而A
不包括在内
我做了strace-f./script
,发现以下输出看起来很相关:
...
[pid 36681] open("foo.txt", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
[pid 36681] dup2(3, 1) = 1
[pid 36681] close(3) = 0
...
[pid 34260] write(1, " A\n", 3) = 3
[pid 34260] lseek(1, 0, SEEK_CUR) = 3
[pid 34260] ftruncate(1, 3) = 0
[pid 34260] write(1, " B\n", 3) = 3
...
从我有限的理解来看,似乎A
被写入文件,然后调用lseek
,这使得文件只有3个字符长(与我尝试写入的第一个字符串长度相同),然后ftruncate
将其截断为3个字符(即Run
)然后将B
写入文件
c中的以下程序(echo“Run-program”>foo.txt;/c_-program
)复制了该行为,因此它似乎不仅仅与fortran相关(尽管只有ifort编译的代码才会给出上述错误)
它在哪里工作
gcc 4.8.5
Darwin laptop 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64
我的Fortran非常生疏,但我认为默认情况下Fortran会将每个
写入作为一个单独的记录,这会产生新的行(和seeks?-对我来说也是一个错误)
如果要抑制该行为,这可能更接近您要查找的内容:
program main
write(*,100, advance='no') 'A'
write(*,100, advance='no') 'B'
100 format (A)
end program
如果相关的话,我从strace中添加了更多的输出。但是我不知道要寻找什么(除了显而易见的),所以请告诉我是否应该包括所有内容。LD_PRELOAD环境变量是否设置为集群上的某个值?可能是您使用了重新定义的lseek函数。这可能是一个与延迟相关的问题。如果你在bash脚本中的回音和跑步之间加了一个睡眠(10秒或大得愚蠢的时间)会怎么样?@anthonysecemama No,它是空的。我没有在我的bashrc中预加载任何库。谢谢你的回答。我添加的代码只是一个重现bug的示例。我正在运行的acctual代码中有数百次写入操作,并且希望存储为日志文件,因此更改所有代码对我来说不是一个好的选择。无论如何,我尝试了您的修复,并在追加后运行程序,现在变成Ru
。strace显示它确实合并到AB
(write(1,“AB”,2)
),但在它仍然调用lseek(1,0,SEEK\u CUR)
和ftruncate
之后。
ifort 14.0.2 20140120
gcc 4.4.7 20120313
Linux cluster 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
gcc 4.8.5
Darwin laptop 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64
program main
write(*,100, advance='no') 'A'
write(*,100, advance='no') 'B'
100 format (A)
end program