我想从bash脚本执行python脚本,并且要将python脚本的输出存储在变量中。
在我的python脚本中,我打印了一些错误消息,值为0或1
def main ():
if condition A :
sys.stderr.write("FORBIDDEN commit")
return 1
else: return 0
sys.exit(main())
这是我的bash脚本:
我使用$?
从python脚本获取退出代码+错误值
python /var/www/svn/TEST/hooks/pre-commit-standard-codeline.py $SVNRepository $SVNTransaction
PYTHONRESULT=$?
echo $PYTHONRESULT >&2 #echo display -->FORBIDDEN commit1
if [ $PYTHONRESULT -ne 0 ];
then
echo -e "\n" >&2
echo "=====================================================================" >&2
echo "Your commit is blocked for the following reasons:" >&2
echo -e "\n" >&2
echo -e ${PYTHONRESULT:0} >&2
echo -e "\n" >&2
echo "=====================================================================" >&2
echo -e "\n"
exit 1
fi
我的问题是在bash脚本中,我想从错误消息中分割python的退出值,以便可以在echo
命令中触发我的结果
我尝试了${PYTHONRESULT:0}
,但是它总是给我python脚本的退出值
答案 0 :(得分:3)
您似乎对前进的方向感到困惑。 Python已经将错误消息写入标准错误,并且 year PD PD_thresh y_pseudo
0 2010 0.5 0.7 0.0
1 2011 0.8 0.8 1.0
2 2013 0.9 0.9 1.0
3 2014 NaN 0.7 NaN
代码最终在外壳程序中的return
中结束了。
通常,您不需要经常显式检查$?
,因为$?
和if
以及朋友会在幕后为您这样做。
也许您正在寻找的只是
while
如果要捕获标准错误,请尝试
if python /var/www/svn/TEST/hooks/pre-commit-standard-codeline.py "$SVNRepository" "$SVNTransaction"; then
: all good, do nothing
pythonresult=0
else
# error message from Python will already have been printed on stderr
# use lower case for your private variables
pythonresult=$?
cat <<-____eof >&2
$0: Obnoxiously long error message.
$0: The longer you make it, the less people will read it
and the more actually useful information scrolls off the screen.
$0: Python result code was $pythonresult!!!!11!
____eof
fi
exit $pythonresult
这有点混乱,因为它混合了标准输出和标准错误。
有必要的话,可以将它们分开,但是您的问题和代码看起来实际上对标准输出没有任何期望。