Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > bash скрипт. получить статус завершения команды


Автор: boostcoder 27.9.2010, 20:14
всем привет.
есть скрипт.
в нем что-то вроде:
Цитата

./configure .............
make
make install

мне нужно получить статус завершения каждой команды, и на основании его, решить, выполнять ли другие команды?

спасибо.

Автор: djamshud 27.9.2010, 20:16
Код

# ping ya.ru -c 1
PING ya.ru (77.88.21.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (77.88.21.3): icmp_req=1 ttl=48 time=26.7 ms

--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 26.781/26.781/26.781/0.000 ms
# echo $?
0
# ping хер
ping: unknown host хер
# echo $?
2


Добавлено через 52 секунды
Хм. Оперативненько:)

Автор: boostcoder 27.9.2010, 20:26
djamshud, а как мне это в if записать?

Автор: djamshud 27.9.2010, 20:36
Ну, думаю, понятно, что для каждой команды $? можно запомнить в отдельную переменную или массив. А дальше man test, он используется внутри if. Сам я if не люблю, сделал бы так, к примеру:

Код

test ${exit1} -ne 0 && test ${exit2} -ne 0 && dosomething


Если же нужны разные действия на разные сочетания кодов возврата, то примерно так
Код


if [ ${exit1} -eq 0 ]; then

  if ...

  if...

fi

Автор: boostcoder 27.9.2010, 20:47
если я тебя правильно понял, то должно получиться что-то вроде этого:

Код

ret1=./configure
if [ ${ret1} -eq 0 ]; then
   ret2=make
   if [ ${ret2} -eq 0 ]; then
      ret3=make install
      if [ ${ret3} -ne 0 ]; then
         echo make install error
      fi
   else
      echo make error
   fi
else
   echo configure error
fi


?

Автор: djamshud 27.9.2010, 20:52
Почти. Только ret-ы нужно получать так:

Код

./configure
ret1=$?


Ну и так далее в том же духе.

Автор: boostcoder 27.9.2010, 20:57
понял.
спасибо smile

Автор: djamshud 27.9.2010, 20:58
Да не за что.

Автор: bilbobagginz 27.9.2010, 21:25
boostcoder

есть несколько вариантов.
вариант I
если решил реально обрабатывать, то нередко в бАшке удобно создать 1 обработчик результатов:
грубо говоря - продолжаем, если 0, или вылетаем если не 0:
Код

function proc_retval {
    case $* in
      0) 
      echo "success!"
      ;;
      *)
      echo "failed with error: $*"
      exit $*
    esac
}

используем:
Код

for c in c1 c2 c3;
do
  $c
  retval=$?
  proc_retval $retval
done

вариант II:
используем направление обработки операторов bash:
Код

c1 && c2 && c3

&& обрабатывается слева направо. т.е. если c1 вернул 0, bash продолжит выполнять цепочку. если нет - вылетит.
т.е. если тебе нужна причина вылета, таким способом ея не получишь.





      

Автор: boostcoder 27.9.2010, 21:28
bilbobagginz, о!
спасибо большое smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)