Cómo detener los scripts bash para que no salgan de la window

Cuando escribo bash script y tengo

exit;; 

o

 exit 0;; 

el script no solo sale sino que la window (o el panel en el caso de los paneles tmux) sale completamente (desaparece).

p.ej

 while true; do read -p 'Run with -a (auto-correct) options?' yn case $yn in [Yy]* ) rubocop -a $@;; [Nn]* ) exit;; # <--here exits window completely ! * ) echo "Yes or No!";; esac done 

¿Cómo puedo prevenir esto?

Mi bashrc es:

 HISTCONTROL=ignoreboth:erasedups HISTSIZE=100000 HISTFILESIZE=200000 shopt -s histappend checkwinsize PROMPT_COMMAND='history -a' test -f ~/.bash_functions.sh && . $_ # I can comment these out & it doesn't help test -f ~/.bash_aliases && . $_ test -f ~/.eq_aliases && . $_ test -f ~/.git-completion.bash && . $_ test -f /etc/bash_completion && ! shopt -oq posix && . /etc/bash_completion test -f ~/.autojump/etc/profile.d/autojump.sh && . $_ ls --color=al > /dev/null 2>&1 && alias ls='ls -F --color=al' || alias ls='ls -G' HOST='\[\033[02;36m\]\h'; HOST=' '$HOST TIME='\[\033[01;31m\]\t \[\033[01;32m\]' LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`' BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ ' PS1=$TIME$USER$HOST$LOCATION$BRANCH PS2='\[\033[01;36m\]>' set -o vi # vi at command line export EDITOR=vim export PATH="/usr/local/heroku/bin:$PATH" # Added by the Heroku Toolbelt export PYTHONPATH=/usr/local/lib/python2.7/site-packages/ # for meld mdd 4/19/2014 [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # friendly for non-text files [ ${BASH_VERSINFO[0]} -ge 4 ] && shopt -s autocd #[ `uname -s` != Linux ] && exec tmux export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting export PATH=$HOME/.node/bin:$PATH 

break es lo que estás buscando.

exit finaliza el process de shell cuando se llama. A medida que obtiene sus scripts de shell, se ejecutan dentro de su caparazón actual. Esto significa que cuando un scripts de shell llega a una exit , terminará su caparazón.

break por otro lado simplemente deja la estructura de bucle actual, el bucle while en su caso.

Del manual bash:

 break break [n] Exit from a for, while, until, or select loop. If n is supplied, the nth enclosing loop is exited. n must be greater than or equal to 1. The return status is zero unless n is not greater than or equal to 1. 

Con un script llamado scriptname.sh que solo contiene esto:

 #!/bin/bash echo "script executed" exit 

Hará que el shell en el que trabaje esté cerca si el script es de origen.

Para evitar que toda la window también se cierre, inicie un nuevo subset bash simplemente ejecutando bash . La profundidad de las subcapas se puede ver en la variable SHLVL:

 $ echo $SHLVL 1 $ bash $ echo $SHLVL 2 $ bash $ echo $SHLVL 3 

Si en ese momento tu fuente el script arriba:

 $ source ./scriptname.sh script executed $ echo $SHLVL 2 

Como puede ver, una instancia de bash se cerró.
Lo mismo sucederá con .

 $ . ./scriptname.sh script executed $ echo $SHLVL 1 

Si vuelve a generar el script en este nivel, se cerrará toda la window. Para evitar esa llamada, una nueva instancia de bash.

Una mejor forma de ejecutar el progtwig ./scriptname.sh es hacer que sea ejecutable:

 $ bash $ echo $SHLVL 2 $ chmod u+x scriptname.sh $ ./scriptname.sh script executed $ echo $SHLVL 2 

O incluso llamando al script con el nombre del shell:

 $ bash ./scriptname script executed $ echo $SHLVL 2