首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行MatLab函数的bash预提交钩子不等待结果。

运行MatLab函数的bash预提交钩子不等待结果。
EN

Stack Overflow用户
提问于 2015-07-20 15:33:30
回答 2查看 600关注 0票数 3

我在Win-7上有一个MatLab项目.

它的版本由Git扩展控制。

我有一个matlab函数,运行一种自我测试。

它名为pre_push_test_suit,它以代码0 (OK)或1(有问题)退出。

我想实现预提交git挂钩,这将防止推到中央回购,如果自我测试功能失败。

我的剧本开头是这样的:

代码语言:javascript
复制
#!/bin/sh
res_file=pre_push_test_log.txt
resultcode=$(matlab -automation -minimize -r pre_push_test_suit -logfile $res_file)
if [ "$resultcode" -eq "0" ]
...

预期结果:我希望脚本午餐MatLab并等待退出值。

实际结果:脚本午餐MatLab进程,并在$resultcode中继续使用空值。

如果正确的话,脚本将在一个bash样的shell上运行,该shell在windows上安装了git,但我不确定它是否是一个真正的bash。

输入ps没有显示matlab过程。

也尝试过,但结果没有改变:

  • 替换$(.)用...
  • 在第三行后添加“等待”
  • 用谷歌搜索。

我没有尝试任何其他语言的脚本,但bash (我不知道很多脚本语言)。

我想到了带有“等待”的无限循环的丑陋解决方案,等待文件包含一些输出,但我更喜欢更体面的方法。

任何更好的解决方案,以任何语言等待结果,都是受欢迎的。

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 15:37:23

这个问题的出现似乎是因为matlab自动从windows中的shell中分离出来(这种行为在Linux上没有使用-nodesktop选项)。

选项1:

使用-wait选项:

来自文档

等待MATLAB终止 默认情况下,当从脚本调用matlab命令时,命令启动MATLAB,然后立即执行脚本中的下一个语句。-wait选项暂停脚本直到MATLAB终止。选择结果 -wait在启动脚本中使用来处理来自MATLAB的结果。使用此选项调用MATLAB将阻止脚本继续运行,直到生成结果。

代码语言:javascript
复制
#!/bin/sh

res_file=pre_push_test_log.txt

resultcode=$(matlab -wait -nodesktop -minimize -r pre_push_test_suit -logfile $res_file) 


if [ "$resultcode" -eq "0" ]

备选方案2:

用八度代替matlab

选项3:

使用“等待”等待进程完成:当任何子进程以代码结束时,如何在bash中等待几个子进程完成并返回退出代码!=0?

-nodesktop选项应该将matlab会话保持在终端的控制范围内。

代码语言:javascript
复制
#!/bin/sh

res_file=pre_push_test_log.txt

resultcode=$(matlab -nodesktop  -minimize -r pre_push_test_suit -logfile $res_file) 
wait $!

if [ "$resultcode" -eq "0" ]

选项3存在问题,请参阅注释

票数 1
EN

Stack Overflow用户

发布于 2015-07-22 09:26:12

没有尝试Octave,因为它需要在团队的每台机器上安装Octave,并且对MatLab和Octave之间的小差异很敏感(我在预推测试中运行了很多代码)。

最后,我将MatLab函数写结果(成功的话是0)写到一个名为$(matlab_file).txt的文件中,实现了我前面提到的ugli循环。

下面是我现在使用的代码:

代码语言:javascript
复制
#!/bin/sh
matlab_file="pre_push_test_suit"
log_file="pre_push_test_log.txt"
res_file="${matlab_file}.txt"
rm -f $log_file
rm -f $res_file
sleep 1
matlab -automation -minimize -r $matlab_file -logfile $log_file
# wait for the result file to exist
until [ -f $res_file ]
do
     sleep 1
done
sleep 1
res_zero="$(grep 0 $res_file | wc -l)"
if [ $res_zero -eq "1" ]
    then
        echo "matlab pre_push_test_suit OK"
        exit 0
fi
echo "matlab pre_push_test_suit exited with an error"
echo "push is prevented"
exit 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31520591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档