это должно работать.
class Child extends Parent
{
private function myMethod()
{
return $this->_anotherP;
}
}
, потому что _anotherP его защищен, поэтому каждый деривативный класс может присоединиться к нему, но его нет в другом объекте, тот же объект.
Однако сделайте геттеры сеттерами в родительском его разумном выборе.
После каждой команды код выхода можно найти в переменной $?
, поэтому у вас будет что-то вроде:
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
.
«set -e
», вероятно, самый простой способ сделать это. Просто поместите это перед любыми командами в вашей программе.
Если вы просто вызовите exit в bash без параметров, он вернет код выхода последней команды. В сочетании с ИЛИ bash должен вызывать выход только в случае неудачи предыдущей команды. Но я не проверял это.
command1 || exit; command2 || exit;
Bash также будет хранить код выхода последней команды в переменной $ ?.
[ $? -eq 0 ] || exit $?; # exit for none-zero return code
Если вы хотите работать с $ ?, вам нужно проверять его после каждой команды, так как $? обновляется после выхода каждой команды. Это означает, что если вы выполните конвейер, вы получите только код завершения последнего процесса в конвейере.
Другой подход заключается в том, чтобы сделать это:
set -e
set -o pipefail
Если вы поместите это наверху сценария оболочки, похоже, bash позаботится об этом за вас. Как отмечалось в предыдущем постере, "set -e" приведет к выходу bash с ошибкой в любой простой команде. «set -o pipefail» приведет к выходу bash с ошибкой и для любой команды в конвейере.
См. здесь или здесь для более подробного обсуждения этой проблемы. Здесь - раздел руководства по bash для встроенного набора.
для 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;
}
В bash это легко, просто свяжите их вместе с & amp; &: amp;
command1 && command2 && command3
Вы также можете использовать вложенную конструкцию if:
if command1
then
if command2
then
do_something
else
exit
fi
else
exit
fi
#
#------------------------------------------------------------------------------
# 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
http://cfaj.freeshell.org/shell/cus-faq-2.html#11
Как получить код выхода из 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]
.
Коды выхода представлены в специальном массиве PIPESTATUS
. cmd1
код выхода находится в ${PIPESTATUS[0]}
, cmd3
код выхода в ${PIPESTATUS[2]}
, так что $?
всегда совпадает с ${PIPESTATUS: -1}
.
...