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の1つのインスタンスが閉じています。
同じことが起こります.
$ . ./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