将输出附加到文件

时间:2015-10-26 22:22:09

标签: linux bash append

我在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个字符长(与第一个字符串相同的长度)尝试编写)然后ftruncate将其截断为3个字符(即Run),然后将B写入文件。

c(echo "Run program" > foo.txt; ./c_program)中的以下程序重现了行为,因此它似乎不仅仅是fortran相关(尽管只有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在我使用的集群上导致问题似乎是合乎逻辑的,但是我知道的很少(我不知道如何解决它)所以我在这里问它。

  

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

这很烦人,因为为了避免它我需要创建一个临时文件并将运行中的输出通过管道传输到此文件中,然后将原始文件与temp文件压缩,以获得所需的输出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

1 个答案:

答案 0 :(得分:0)

我的Fortran非常生疏,但我认为默认情况下Fortran会将每个return $this->belongsToMany('App\Role')->withPivot('column1', 'column2'); 视为一个单独的记录,这会产生新的行(和搜索? - 这对我来说似乎也是一个错误)

如果你想抑制这种行为,这可能会更接近你所寻找的行为:

write