Bash 스크립트가 창을 종료하는 것을 완전히 방지하는 방법

Bash 스크립트가 창을 종료하는 것을 완전히 방지하는 방법

Bash 스크립트를 작성할 때,

exit;;

또는

exit 0;;

스크립트가 종료될 뿐만 아니라 창(또는 tmux 창 내의 창)도 완전히 종료됩니다(사라집니다).

예를 들어

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

이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?

내 .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='\[\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

답변1

break당신이 찾고있는 것.

exit호출되면 쉘 프로세스를 종료합니다. 쉘 스크립트를 얻으면 현재 쉘에서 실행됩니다. 이는 소스 쉘 스크립트에 도달하면 exit쉘이 종료됨을 의미합니다.

break반면에 현재 루프 구조(귀하의 경우에는 while 루프)만 유지됩니다.

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.

답변2

명명된 스크립트에는 scriptname.sh다음 내용만 포함되어 있습니다.

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

스크립트가 소스로 제공되면 작업 중인 셸이 종료됩니다.

전체 창이 닫히는 것을 방지하려면 실행하여 새 bash 하위 쉘을 시작하십시오 bash. 서브쉘의 깊이는 SLVL 변수에서 확인할 수 있습니다.

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

이 시점에서 위의 스크립트를 얻은 경우:

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

보시다시피, bash의 한 인스턴스가 닫혀 있습니다.
같은 일이 일어날 것입니다.

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

이 수준에서 스크립트를 다시 가져오면 전체 창이 닫힙니다. 이를 방지하려면 bash의 새 인스턴스를 호출하십시오.

./scriptname.sh 프로그램을 실행하는 더 좋은 방법은 프로그램을 실행 가능하게 만드는 것입니다.

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

또는 쉘 이름을 사용하여 스크립트를 호출할 수도 있습니다.

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

관련 정보