Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将输出附加到文件时出现奇怪的错误_Linux_Bash_Append - Fatal编程技术网

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

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

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

我有一个bash脚本,我在其中执行以下操作

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