2016-12-28 12 views
0

В принципе, я пытаюсь выйти из подоболочки, содержащей цикл. Вот код: `Как выйти из Subshell

stop=0 
( # subshell start 
    while true   # Loop start 
    do 
     sleep 1   # Wait a second 
     echo 1 >> /tmp/output   # Add a line to a test file 

     if [ $stop = 1 ]; then exit; fi   # This should exit the subshell if $stop is 1 
    done # Loop done 

) |   # Do I need this pipe? 

    while true 
    do 
     zenity --title="Test" --ok-label="Stop" --cancel-label="Refresh" --text-info --filename=/tmp/output --font=couriernew  # This opens Zenity and shows the file. It returns 0 when I click stop. 

     if [ "$?" = 0 ]  # If Zenity returns 0, then 
     then 
     let stop=1  # This should close the subshell, and 
     break  # This should close this loop 
     fi 
    done  # This loop end 
    echo Done 

Это не работает. Он никогда не говорит «Сделано». Когда я нажимаю кнопку «Стоп», он просто закрывает диалог, но продолжает записывать в файл.

Редактировать: Мне нужно передать переменную из подоболочки в родительскую оболочку. Тем не менее, мне нужно продолжать писать в файл и поддерживать диалог Zenity. Как мне это сделать?

+0

Я не думаю, что понимаю. Есть ли специальный способ выхода из подоболочек? – Feldspar15523

ответ

2

Когда вы создаете подоболочку, он создает подпроцесс текущей оболочки. Это означает, что если вы отредактируете переменную в одной оболочке, она не будет отражена в другом, потому что это различные процессы. Я предлагаю вам отправить подоболочку на задний план и использовать $!, чтобы получить свой PID, а затем использовать этот PID, чтобы убить подоболочку, когда будете готовы. Это будет выглядеть так:

(        # subshell start 
    while true     # Loop start 
    do 
     sleep 1     # Wait a second 
     echo 1 >> /tmp/output # Add a line to a test file 
    done      # Loop done 

) &        # Send the subshell to the background 

SUBSHELL_PID=$!     # Get the PID of the backgrounded subshell 

while true 
do 
    zenity --title="Test" --ok-label="Stop" --cancel-label="Refresh" --text-info --filename=/tmp/output --font=couriernew  # This opens Zenity and shows the file. It returns 0 when I click stop. 

    if [ "$?" = 0 ]    # If Zenity returns 0, then 
    then 
    kill $SUBSHELL_PID   # This will kill the subshell 
    break      # This should close this loop 
    fi 
done       # This loop end 

echo Done 
+0

Явная подоболочка с круглыми скобками бесполезна (и, вероятно, не нужна). –

+0

Работает с круглыми скобками или без них; это просто вопрос отправки подоболочки на фон или петлю. Я лично предпочитаю подоболочку, потому что она дает понять, что посылается на задний план, в отличие от 'while ......... done &', который для меня выглядит как «done», он все еще работает). Есть ли веская причина, чтобы опустить паренс? –

+0

Если я изменю переменную в подоболочке, она будет изменена в основном? Если нет, то как мне отправить значение между этими двумя? – Feldspar15523