Вернуть номер выхода и значение скрипта Python в скрипте bash - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу выполнить скрипт Python из скрипта bash и сохранить выходные данные скрипта 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 я хочу отделить выходное значение питона от сообщения об ошибке, чтобы я мог вызвать свои результаты в команде echo

, которую я пробовал ${PYTHONRESULT:0}, но она всегда дает мне выходное значениескрипт python

1 Ответ

0 голосов
/ 21 февраля 2019

Вы, кажется, не понимаете, что и куда идет.Python уже записывает сообщение об ошибке в стандартную ошибку, и код 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

Если вы хотите зафиксировать стандартную ошибку, попробуйте

if captured=$(python ... 2>&1); then
    # mostly as above
    pythonresult=0
    # etc
else
    # mostly as above
    pythonresult=$?
    # etc
    # but you can use "$captured" to show stderr from Python
    # with whatever embellishments and screaming you want
fi

Это немного грязно, потому что смешивает стандартный вывод и стандартную ошибку.

Существуют способы разделить их, если это необходимо, но ваш вопрос и код выглядят так, как будто вы ничего не ожидаете от стандартного вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...