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
文件中的第一行并不总是以bash脚本打印_Bash_Output Redirect - Fatal编程技术网

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

文件中的第一行并不总是以bash脚本打印,bash,output-redirect,Bash,Output Redirect,我有一个bash脚本,它将一行文本打印到一个文件中,然后调用第二个脚本将更多的数据打印到同一个文件中。我们将它们称为script1.sh和script2.sh。它被分成两个脚本的原因是,我有不同版本的script2.sh 脚本1.sh: rm -f output.txt echo "some text here" > output.txt source script2.sh 脚本2.sh: ./read_time >> output.txt ./run_program ./r

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

脚本1.sh:

rm -f output.txt
echo "some text here" > output.txt
source script2.sh
脚本2.sh:

./read_time >> output.txt
./run_program
./read_time >> output.txt
script2.sh中三行的变化会重复

这似乎在大多数情况下都有效,但每隔一段时间,文件output.txt就不包含“此处的某些文本”行。起初我认为这是因为我是这样调用script2.sh的:
/script2.sh
。但即使使用
源代码
,问题仍然存在。 这个问题是不可复制的,所以即使我试图改变一些东西,我也不知道它是否真的被修复了

这可能是什么原因造成的

编辑: 脚本非常简单。script1与您在这里看到的完全相同,但具有不同的文件名。脚本2是我发布的,但是相同的3行重复出现,并且
/run\u program
可以有不同的参数。我对输出文件和
进行了grep,但它没有出现在任何意外的地方

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

编辑2:
我最终设法以合理的速度重现问题,方法是将script2.sh中的所有内容都去掉,只在文件中打印一行。这也让我的测试速度加快了一点。一旦出现这种情况,我每运行10次就会出现1到4次问题。在脚本运行之前,删除通过ssh删除文件的命令as run似乎已经解决了这个问题。我将对它进行更多的测试以确定问题是否已解决,但我认为它已解决。尽管我仍然不确定为什么会出现问题。我认为ssh命令不会在执行所有删除命令之前退出。

如果看不到真正的代码,很难判断。最可能的解释是您有一个ypo,
而不是
>
,位于其中一个script2.sh文件中的某个位置

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


另一种可能性是,该文件在某些罕见的情况下被删除。或者它被某个可以随机访问它的命令损坏-查找使用该文件而不使用
>
的命令。或者它被某个命令用作输入和输出,这两个命令相互作用-查找与
一起使用的文件是否可以全部grep我们的“output.txt”脚本?在read_time和run_程序中调用的脚本怎么样

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

例如,可能有一个“>output.txt”隐藏在一个很少获得的条件的条件中。这只是一个猜测,但它可以解释为什么你不总是看到它


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

我很确定情况并非如此。当我注意到问题并再次运行同一脚本时,它就会消失。另外,为了确保我检查了一些我注意到的脚本,其中没有丢失的
。我想发布当然,但我不能。还有一个普遍的建议:开始简化你的脚本,删除不相关的代码,直到事情发生的很明显,或者你可以将它们发布到你的问题中。同时检查我对答案的补充。我试着设置noclobber,但没有出现错误。我认为这必须是随机删除文件的东西,但是我想不出有什么能做到这一点。顺便说一句,脚本1已经完成了。我唯一要做的就是更改名称和打印到文件中的文本。脚本2基本上调用不同的程序,并将开始和结束时间打印到一个文件中。没有一个程序访问output.txt。脚本2的每个版本调用不同的程序,或者同一个程序具有不同的参数。在所有情况下,get_time程序是唯一一个将输出重定向到文件的程序。此外,由于我无法可靠地再现问题,我无法知道导致问题的最小情况是什么。对脚本进行Grepping只会得到类似
/read_time>>output.txt
.I这样的结果我还搜索了当时运行的其他程序的源代码,但没有人提到output.txt。一个相关的想法是将这样一个通用的输出名称更改为O.P.s环境中任何地方的任何其他程序都不太可能使用的名称,如
special\u testCase.$$.txt.output
,或类似的疯狂行为。祝大家好运。实际文件名为sw_events.log,但感谢您的建议。好的,如果总是运行script1.sh,我们知道文本会写入文件,因此必须删除或更改文件。可能“output.txt”在配置文件中?或者可能其中一个脚本会动态创建一个包含“output.txt”的变量?例如file=
ls | grep'output'
(我知道这是一个很小的例子)。你能在远程文件系统或NFS安装的文件系统上grep For rm?或all'>'?is output.txt吗?恭喜你解决了这个问题:)!谢谢你的帮助。原来ssh是以非阻塞方式启动的。我把它改为blocking,现在它可以正常工作了。我准备检查一下第一行w