How to exit a Subshell

十年热恋 提交于 2019-12-25 07:40:11

问题


Basically, I am trying to exit a subshell that contains a loop. Here is the code: `

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

This does not work. It never says Done. When I press Stop it just closes the dialog, but keeps writing to the file.

Edit: I need to be able to pass a variable from the subshell to the parent shell. However, I need to keep writing to the file and keep the Zenity dialog coming up. How would I do this?


回答1:


When you spawn a subshell, it creates a subprocess of the current shell. This means that if you edit a variable in one shell, it will not be reflected in the other, because they are different processes. I suggest you send the subshell to the background and use $! to get its PID, then use that PID to kill the subshell when you're ready. That would look like this:

(                               # 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


来源:https://stackoverflow.com/questions/41370092/how-to-exit-a-subshell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!