离开源shell脚本而不退出终端

时间:2014-12-18 17:48:18

标签: bash shell scripting

我正在编写一个shell脚本来保存一些击键并避免拼写错误。我想将脚本保存为调用内部方法/函数的单个文件,并在出现问题而不离开终端时终止函数。

my_script.sh

#!/bin/bash
exit_if_no_git() {
  # if no git directory found, exit
  # ...
  exit 1
}

branch() {
  exit_if_no_git
  # some code...
}

push() {
  exit_if_no_git
  # some code...
}

feature() {
  exit_if_no_git
  # some code...
}

bug() {
  exit_if_no_git
  # some code...
}

我想通过以下方式致电:

$ branch
$ feature
$ bug
$ ...

我知道我可以在source git_extensions.sh.bash_profile,但当我执行其中一个命令并且没有.git目录时,它会按预期exit 1但是这样也退出终端本身(因为它来源)。

是否有exit函数的替代方法,这些函数也会退出终端?

1 个答案:

答案 0 :(得分:2)

不是定义函数exit_if_no_git,而是将其定义为has_git_dir

has_git_dir() {
  local dir=${1:-$PWD}             # allow optional argument
  while [[ $dir = */* ]]; do       # while not at root...
    [[ -d $dir/.git ]] && return 0 # ...if a .git exists, return success
    dir=${dir%/*}                  # ...otherwise trim the last element
  done
  return 1                         # if nothing was found, return failure
}

......以及其他地方:

branch() {
  has_git_dir || return
  # ...actual logic here...
}

这样功能就会短路,但不会发生shell级别退出。


还可以使用source退出return d文件,防止其中的后续功能被定义,如果return在此类文件中的顶层运行