2014-09-04 3 views
0

Скажем, у меня есть два сценария, которые просто печатают обратно код возврата из бесполезного индекс:BASH: Как узнать, использует ли сценарий выход?

script1

(echo; exit 0) 
echo $? 

Скрипт2

(echo) 
echo $? 

Оба дают назад 0. Но есть ли способ сказать, что первый индекс явно использует команду exit?

+2

Не знаю, о чем я знаю. почему ты хочешь сделать это? –

+0

Просто выйдите с другим значением, отличным от 0, чтобы указать выход. – choroba

+0

@EtanReisner Скажем, я создаю оболочку для других скриптов. – Pithikos

ответ

1

После некоторых исследований я получил некоторый прорыв. А именно, вы можете настроить exit_handler, который может определить, был ли вызов выхода, просто просмотрев последнюю команду.

#! /bin/bash 

exit_handler() { 
    ret=$? 
    if echo "$BASH_COMMAND" | grep -e "^exit " >> /dev/null 
    then 
     echo "it was an explicit exit" 
    else 
     echo "it was an implicit exit" 
    fi 
    exit $ret 
} 
trap "exit_handler" EXIT 

exit 22 

Это напечатает

it was an explicit exit 

Теперь для того, чтобы сказать родителям, а вторя, можно скорее записать в файл, именованный канал или любой другой.


В соответствии отметить из choroba, exit без аргумента даст implicit call, который, по общему признанию, так как неправильно exit (без аргумента) является такой же, как exit $?. По этой причине регулярное выражение должно учитывать это:

#! /bin/bash 

exit_handler() { 
    ret=$? 
    if echo "$BASH_COMMAND" | grep -e "^exit \|^exit$" >> /dev/null 
    then 
     echo "it was an explicit exit" 
    else 
     echo "it was an implicit exit" 
    fi 
    exit $ret 
} 
trap "exit_handler" EXIT 

exit 22 
+0

Вы выполняете 'exit_handler()' в каждом 'script1' и' script2'. Что делать, если последняя команда в 'script2' является' echo 'Теперь пришло время выйти из ''? –

+0

Я принял это во внимание. Он не должен проходить с регулярным выражением '^ exit', поскольку регулярное выражение разрешает только команду, начинающуюся с выхода, за которой следует пробел. Единственной командой, которая может быть, является 'exit' – Pithikos

+0

Похоже, это хорошее решение. Я снова просмотрел раздел 'Переменные оболочки' 'man bash'. Я думаю, вы натолкнулись на хорошее решение. Единственное любопытство, которое у меня есть, это то, как это описано в 'BASH_COMMAND', в частности, ** это команда, выполняемая во время ловушки **. Очевидно, что он работает, но было бы приятно убедиться, что ** это последняя команда, выполненная до момента ловушки **. Ну, мне все равно нравится :) –

Смежные вопросы