如何完全阻止 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调用时终止 shell 进程。当您获取 shell 脚本时,它们会在您当前的 shell 中运行。这意味着当源 shell 脚本命中时,exit它将终止您的 shell。

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

如果脚本是有源的,将使您正在工作的 shell 关闭。

为了防止整个窗口也关闭,只需执行 即可启动一个新的 bash 子 shell 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

或者甚至使用 shell 的名称调用脚本:

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

相关内容