我在Win-7上有一个MatLab项目.
它的版本由Git扩展控制。
我有一个matlab函数,运行一种自我测试。
它名为pre_push_test_suit,它以代码0 (OK)或1(有问题)退出。
我想实现预提交git挂钩,这将防止推到中央回购,如果自我测试功能失败。
我的剧本开头是这样的:
#!/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 (我不知道很多脚本语言)。
我想到了带有“等待”的无限循环的丑陋解决方案,等待文件包含一些输出,但我更喜欢更体面的方法。
任何更好的解决方案,以任何语言等待结果,都是受欢迎的。
发布于 2015-07-20 15:37:23
这个问题的出现似乎是因为matlab自动从windows中的shell中分离出来(这种行为在Linux上没有使用-nodesktop选项)。
选项1:
使用-wait选项:
来自文档
等待MATLAB终止 默认情况下,当从脚本调用matlab命令时,命令启动MATLAB,然后立即执行脚本中的下一个语句。-wait选项暂停脚本直到MATLAB终止。选择结果 -wait在启动脚本中使用来处理来自MATLAB的结果。使用此选项调用MATLAB将阻止脚本继续运行,直到生成结果。
#!/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会话保持在终端的控制范围内。
#!/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存在问题,请参阅注释
发布于 2015-07-22 09:26:12
没有尝试Octave,因为它需要在团队的每台机器上安装Octave,并且对MatLab和Octave之间的小差异很敏感(我在预推测试中运行了很多代码)。
最后,我将MatLab函数写结果(成功的话是0)写到一个名为$(matlab_file).txt的文件中,实现了我前面提到的ugli循环。
下面是我现在使用的代码:
#!/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 1https://stackoverflow.com/questions/31520591
复制相似问题