Como impedir que scripts do bash saiam completamente da janela

3

Quando escrevo um script bash e tenho

exit;;

ou

exit 0;;

o script não apenas sai, mas a janela (ou painel no caso de painéis tmux) sai completamente (vai embora).

por exemplo,

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

Como posso evitar isso?

Meu bashrc é:

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='\[3[02;36m\]\h'; HOST=' '$HOST
TIME='\[3[01;31m\]\t \[3[01;32m\]'
LOCATION=' \[3[01;34m\]'pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#_#g"''
BRANCH=' \[3[00;33m\]$(git_branch)\[3[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH
PS2='\[3[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
    
por Michael Durrant 08.12.2015 / 02:46

2 respostas

2

break é o que você está procurando.

exit termina o processo do shell quando chamado. Como você está adquirindo seus scripts de shell, eles são executados dentro do seu shell atual. Isso significa que quando um script de shell originado atingir um exit , ele terminará seu shell.

break , por outro lado, simplesmente deixa a estrutura de loop atual, o loop while no seu caso.

Do manual do 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.
    
por 08.12.2015 / 10:09
0

Com um script chamado scriptname.sh , que contém apenas isto:

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

O shell onde você está trabalhando é fechado se o script for originado.

Para evitar que toda a janela seja fechada, inicie um novo sub-shell bash simplesmente executando bash . A profundidade das sub-shells pode ser vista na variável SHLVL:

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

Se nesse momento você pesquisar o script acima:

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

Como você pode ver, uma instância do bash foi fechada.
O mesmo acontecerá com .

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

Se você originar o script novamente nesse nível, toda a janela será fechada. Para evitar isso, chame uma nova instância de bash.

A melhor maneira de executar o programa ./scriptname.sh é torná-lo executável:

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

Ou até mesmo chamando o script com o nome do shell:

$ bash ./scriptname
script executed
$ echo $SHLVL
2
    
por 08.12.2015 / 05:08