bash:脚本将重定向的文件视为“不存在”

bash:脚本将重定向的文件视为“不存在”,bash,Bash,我想检查最后一个命令是否有任何错误,从而将stderr重定向到一个文件并检查文件中的错误字符串。在这种情况下,只有一个可能的错误 我的脚本如下所示: #aquire lock rm -f /some/path/err.out MyProgramme 2>/some/path/err.out & if grep -i "error" /some/path/err.out ; then echo "ERROR while running MyProgramme, c

我想检查最后一个命令是否有任何错误,从而将stderr重定向到一个文件并检查文件中的错误字符串。在这种情况下,只有一个可能的错误

我的脚本如下所示:

 #aquire lock

 rm -f /some/path/err.out
 MyProgramme 2>/some/path/err.out &

 if grep -i "error" /some/path/err.out ; then
    echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)"
    #release lock          
    exit 1
 fi
“如果”条件在err.out上给出错误“没有这样的文件或目录”,但是我可以看到该文件存在

我错过什么了吗?。。感谢您的帮助。谢谢

PS:我无法使用$检查退出代码?因为它是在后台运行的。

当您在后台启动MyProgram时,grep可能在MyProgram写入并创建文件/some/path/err.out之前执行。这就是为什么即使该文件稍后在您自己检查时存在,grep也找不到它


在使用grep检查文件之前,您可以使用wait等待后台作业完成。

除了调用grep时可能不存在的文件外,您只调用grep一次,它只查看文件中当前的任何数据。grep将不会在文件结束时继续读取,等待myprogram完成。相反,我建议使用命名管道作为grep的输入。这将导致grep继续从管道读取数据,直到myprogram实际上完成为止

#aquire lock

rm -f /some/path/err.out
p=/some/path/err.out
mkfifo "$p"
MyProgramme 2> "$p" &


if grep -i "error" "$p" ; then
   echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)"
   #release lock          
   exit
fi

谢谢你的回答。这里运行的程序永远不会结束。除了等待还有其他方法吗?嗯,我可能错了,但我认为>会导致文件立即被创建/截断?@Srikanth如果程序从未结束,那么您如何知道它在什么时候打印错误?你想等多久?如果错误文件不存在,是否立即退出脚本?我的意思是,如果程序永远运行或长时间运行,那么就不应该在最后或至少定期检查是否有错误。我想检查启动程序时是否有任何错误,比如无法打开共享库。@123@TomFenech调用shell,在看到&,首先分叉子shell来处理管道。子shell是在启动MyProgram之前创建文件的shell,在运行grep之前可能不会被安排。