文件中的第一行并不总是以bash脚本打印

时间:2013-05-30 18:50:53

标签: bash output-redirect

我有一个bash脚本,它将一行文本打印到一个文件中,然后调用另一个脚本,将另外一些数据打印到同一个文件中。让我们称它们为script1.sh和script2.sh。它被分成两个脚本的原因是因为我有不同版本的script2.sh。

script1.sh:

rm -f output.txt
echo "some text here" > output.txt
source script2.sh

script2.sh:

./read_time >> output.txt
./run_program
./read_time >> output.txt

重复了script2.sh中三行的变化。

这似乎在大部分时间都有效,但每隔一段时间文件output.txt就不包含“some text here”这一行。起初我以为是因为我这样调用script2.sh:./script2.sh。但即使使用source,问题仍然存在。 这个问题是不可重复的,所以即使我试图改变一些东西,我也不知道它是否真的被修复了。

导致这种情况的原因是什么?

编辑: 脚本非常简单。 script1与您在此处看到的完全相同,但文件名不同。脚本2是我发布的,但是重复相同的3行,./run_program可以有不同的参数。我为输出文件做了一个grep,对>做了一个grep,但它并没有出现意外的地方。

这些脚本的使用方式是script1是由程序创建的(版本之间的唯一区别是source script2.sh行。然后这个script1.sh在不同的计算机上运行(实际上是FPGA上的linux)使用ssh。在完成之前,输出文件也是使用ssh删除的。我不知道为什么,但我没有写完所有这些。另外,我已经检查了主机上运行的代码。提到输出文件的时候是使用ssh删除它,以及在script1完成后将其复制回主机。

编辑2: 我终于设法通过删除脚本打印到文件中的所有内容,以合理的速度重现问题。这也让我更快地进行测试。有了这个,我每10次运行就会遇到1到4次问题。在脚本运行之前删除通过ssh删除文件的命令似乎已经解决了问题。我会更多地测试它,但我认为它已经解决了。虽然我还不确定为什么会出问题。我认为在执行所有删除命令之前,ssh命令不会退出。

2 个答案:

答案 0 :(得分:1)

如果没有看到真正的代码,很难分辨。最有可能的解释是,您在其中一个script2.sh文件中有某个拼写错误>而不是>>

要验证这一点,请将noclobber选项设为set -o noclobber。然后,当尝试使用>写入现有文件时,shell将终止。

另一种可能性是,在某些罕见的条件下删除该文件。或者它被一些可以随机访问它的命令损坏 - 使用这个文件查找没有>>的命令。或者它被某些命令用作输入和输出,它们相互衔接 - 查找与<一起使用的文件。

最后,您可以使用命令输出到后台文件的竞赛条件,在echo之前启动。

答案 1 :(得分:1)

你可以为'output.txt'grep所有脚本吗?在read_time和run_program中调用的脚本怎么样?

看起来其中一个script2.sh脚本中的某些内容必须覆盖,截断或在output.txt上进行替换。

例如,可能有'&gt; output.txt'埋没在一个很少获得的条件的条件内。只是一个猜测,但它可以解释为什么你不总是看到它。

这是一个有趣的问题。请在找到解决方案后发布解决方案!