将输出附加到文件时出现奇怪的错误

当追加到bash文件中的文本被删除时,我有一个奇怪的错误,即使我告诉它追加。

我有一个bash脚本,我做了以下

echo "Run program" > foo.txt ./fortran_program >> foo.txt 

程序fortran_program(得到相同结果的精简版本)是:

 program main write(*,*) 'A' write(*,*) 'B' end program 

这应该给我执行后在foo.txt Run program AB 。 但是,我发现Run 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个字符长(与我试图写的第一个string的长度相同),然后ftruncate截断它在3字符(即Run ),然后将B写入文件。

c( echo "Run program" > foo.txt; ./c_program )中的以下程序重现了行为,所以它看起来不仅仅是fortran相关的(尽pipe只有ifort编译的代码给出了上面的错误)

 #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> int main(){ int n, f; f = open("foo.txt", O_WRONLY | O_CREAT | O_APPEND, 0666); write(f," A\n",3); n = lseek(f,0,SEEK_CUR); ftruncate(f,n); write(f," B\n",3); } 

奇怪的是,当我在我的笔记本电脑上运行上面的代码,它做了预期的事情,并给我Run Program AB所以看起来合理lseek导致我使用的集群上的问题,但我知道一点(和我不知道如何解决),所以我在这里问。

为什么会发生这种情况,最重要的是:是否有办法解决这个问题?

这是相当恼人的,因为为了避免它,我需要做一个临时文件,并从运行pipe道输出到此,然后凝结原始文件与临时文件,然后得到所需的输出到foo.txt

系统规格,我有问题:

 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 

我的Fortran非常生疏,但我认为默认情况下,Fortran会将每个write作为一个单独的记录来处理,从而产生新的行(和寻找? – 这对我来说也是一个错误)。

如果你想压制这种行为,这可能会更接近你要找的东西:

 program main write(*,100, advance='no') 'A' write(*,100, advance='no') 'B' 100 format (A) end program