foo.txt ./fo-6ren">
gpt4 book ai didi

linux - 将输出 append 到文件时出现奇怪的错误

转载 作者:太空狗 更新时间:2023-10-29 11:21:47 24 4
gpt4 key购买 nike

我在 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 个字符长(相同length 作为我尝试写入的第一个字符串),然后 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 导致我使用的集群上的问题,但我对此知之甚少(而且我不知道如何解决)所以我在这里问。

Why does this happen and most importantly: is there a way to fix this?

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

关于linux - 将输出 append 到文件时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33356665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com