Скрипт выхода из оболочки на основе кода выхода процесса

это должно работать.

class Child extends Parent
{
  private function myMethod()
  {
    return $this->_anotherP;
  }
}

, потому что _anotherP его защищен, поэтому каждый деривативный класс может присоединиться к нему, но его нет в другом объекте, тот же объект.

Однако сделайте геттеры сеттерами в родительском его разумном выборе.

368
задан Cerin 31 July 2011 в 19:12
поделиться

9 ответов

После каждой команды код выхода можно найти в переменной $?, поэтому у вас будет что-то вроде:

ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi

Вы должны быть осторожны с переданными командами, так как $? дает только Вы возвращаете код последнего элемента в конвейере, поэтому в коде:

ls -al file.ext | sed 's/^/xx: /"

не будет возвращаться код ошибки, если файл не существует (так как фактически часть конвейера sed работает, возвращая 0).

Оболочка bash фактически предоставляет массив, который может помочь в этом случае, то есть PIPESTATUS. Этот массив имеет один элемент для каждого из компонентов конвейера, к которому вы можете обращаться по отдельности, например, ${PIPESTATUS[0]}:

pax> false | true ; echo ${PIPESTATUS[0]}
1

. Обратите внимание, что это дает вам результат команды false, а не весь конвейер. , Вы также можете получить весь список для обработки по своему усмотрению:

pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1

Если вы хотите получить наибольший код ошибки из конвейера, вы можете использовать что-то вроде:

true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc

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

474
ответ дан paxdiablo 31 July 2011 в 19:12
поделиться

«set -e», вероятно, самый простой способ сделать это. Просто поместите это перед любыми командами в вашей программе.

50
ответ дан Allen 31 July 2011 в 19:12
поделиться

Если вы просто вызовите exit в bash без параметров, он вернет код выхода последней команды. В сочетании с ИЛИ bash должен вызывать выход только в случае неудачи предыдущей команды. Но я не проверял это.

command1 || exit;
command2 || exit;

Bash также будет хранить код выхода последней команды в переменной $ ?.

28
ответ дан Arvodan 31 July 2011 в 19:12
поделиться
[ $? -eq 0 ] || exit $?; # exit for none-zero return code
25
ответ дан Sk8erPeter 31 July 2011 в 19:12
поделиться

Если вы хотите работать с $ ?, вам нужно проверять его после каждой команды, так как $? обновляется после выхода каждой команды. Это означает, что если вы выполните конвейер, вы получите только код завершения последнего процесса в конвейере.

Другой подход заключается в том, чтобы сделать это:

set -e
set -o pipefail

Если вы поместите это наверху сценария оболочки, похоже, bash позаботится об этом за вас. Как отмечалось в предыдущем постере, "set -e" приведет к выходу bash с ошибкой в ​​любой простой команде. «set -o pipefail» приведет к выходу bash с ошибкой и для любой команды в конвейере.

См. здесь или здесь для более подробного обсуждения этой проблемы. Здесь - раздел руководства по bash для встроенного набора.

213
ответ дан Jeff Hill 31 July 2011 в 19:12
поделиться

для bash:

# this will trap any errors or commands with non-zero exit status
# by calling function catch_errors()
trap catch_errors ERR;

#
# ... the rest of the script goes here
#  

function catch_errors() {
   # do whatever on errors
   # 
   #
   echo "script aborted, because of errors";
   exit 0;
}
19
ответ дан 31 July 2011 в 19:12
поделиться

В bash это легко, просто свяжите их вместе с & amp; &: amp;

command1 && command2 && command3

Вы также можете использовать вложенную конструкцию if:

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi
11
ответ дан Martin W 31 July 2011 в 19:12
поделиться
#
#------------------------------------------------------------------------------
# run a command on failure exit with message
# doPrintHelp: doRunCmdOrExit "$cmd"
# call by:
# set -e ; doRunCmdOrExit "$cmd" ; set +e
#------------------------------------------------------------------------------
doRunCmdOrExit(){
    cmd="$@" ;

    doLog "DEBUG running cmd or exit: \"$cmd\""
    msg=$($cmd 2>&1)
    export exit_code=$?

    # if occured during the execution exit with error
    error_msg="Failed to run the command:
        \"$cmd\" with the output:
        \"$msg\" !!!"

    if [ $exit_code -ne 0 ] ; then
        doLog "ERROR $msg"
        doLog "FATAL $msg"
        doExit "$exit_code" "$error_msg"
    else
        #if no errors occured just log the message
        doLog "DEBUG : cmdoutput : \"$msg\""
        doLog "INFO  $msg"
    fi

}
#eof func doRunCmdOrExit
4
ответ дан Yordan Georgiev 31 July 2011 в 19:12
поделиться

http://cfaj.freeshell.org/shell/cus-faq-2.html#11

  1. Как получить код выхода из cmd1 в cmd1|cmd2

    Во-первых, обратите внимание, что код выхода cmd1 может быть ненулевым и все же не означать ошибку. Это происходит, например, в

    cmd | head -1
    

    вы можете наблюдать 141 (или 269 с ksh93) состояние выхода cmd1, но это потому, что cmd был прерван сигналом SIGPIPE, когда head -1 завершился после прочитав одну строку.

    Чтобы узнать состояние выхода элементов трубопровода cmd1 | cmd2 | cmd3

    a. с zsh:

    Коды выхода предоставляются в специальном массиве pipestatus. cmd1 код выхода находится в $pipestatus[1], cmd3 код выхода в $pipestatus[3], так что $? всегда совпадает с $pipestatus[-1].

    [Тысяча сто тридцать два] б. с bash:

    Коды выхода представлены в специальном массиве PIPESTATUS. cmd1 код выхода находится в ${PIPESTATUS[0]}, cmd3 код выхода в ${PIPESTATUS[2]}, так что $? всегда совпадает с ${PIPESTATUS: -1}.

    ...

    Подробнее см. Следующую ссылку .

21
ответ дан gatoatigrado 31 July 2011 в 19:12
поделиться