在bash中,退出脚本而不退出外壳,或者从子外壳中导出/设置变量

dx_over_dt

我有一个函数,该函数运行一组脚本,这些脚本在当前shell中设置变量,函数和别名。

reloadVariablesFromScript() {
  for script in "${scripts[@]}"; do
    . "$script"
  done
}

如果其中一个脚本有错误,我想退出该脚本,然后退出该功能,但不要杀死该外壳。

reloadVariablesFromScript() {
  for script in "${scripts[@]}"; do
    {(
      set -e
      . "$script"
    )}
    if [[ $? -ne 0 ]]; then
      >&2 echo $script failed.  Skipping remaining scripts.
      return 1
    fi
  done
}

这将满足我的要求,只是它不会在脚本中设置变量是成功还是失败。

没有子set -e外壳,将导致整个外壳退出,这是不希望的。

有没有一种方法可以防止被调用的脚本继续发生错误而不杀死shell,或者可以从子shell内设置/导出变量,别名和函数?

以下脚本模拟了我的问题:

test() {
  {(
    set -e

    export foo=bar
    false
    echo Should not have gotten here!
    export bar=baz
  )}

  local errorCode=$?

  echo foo="'$foo'".  It should equal 'bar'.
  echo bar="'$bar'".  It should not be set.

  if [[ $errorCode -ne 0 ]]; then
    echo Script failed correctly.  Exiting function.
    return 1
  fi

  echo Should not have gotten here!
}

test

更糟的是,由于这些脚本实际上并未编辑文件系统,因此我可以在子外壳程序中运行每个脚本,检查退出代码,如果成功,则可以在子外壳程序外部运行它。

查尔斯·达菲

请注意,它set -e具有许多令人惊讶的行为-普遍认为,依靠它不是一个好主意。但是,需要注意的是:我们可以将环境变量,别名和shell函数改写为文本:

envTest() {
  local errorCode newVars
  newVars=$(
    set -e

    {
      export foo=bar
      false
      echo Should not have gotten here!
      export bar=baz
    } >&2

    # print generate code which, when eval'd, recreates our functions and variables
    declare -p | egrep -v '^declare -[^[:space:]]*r'
    declare -f
    alias -p
  ); errorCode=$?
  if (( errorCode == 0 )); then
    eval "$newVars"
  fi
 
  printf 'foo=%q. It should equal %q\n' "$foo" "bar"
  printf 'bar=%q. It should not be set.\n' "$bar"
 
  if [[ $errorCode -ne 0 ]]; then
    echo 'Script failed correctly.  Exiting function.'
    return 1
  fi
 
  echo 'Should not have gotten here!'
}
 
envTest

请注意,此代码只计算或者 export应当将整个脚本段成功; 问题文本和注释似乎表明,如果不需要的话,这是可以接受的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从子外壳退出外壳脚本

来自分类Dev

在不退出终端的情况下退出错误句柄功能中的外壳脚本

来自分类Dev

从子外壳脚本中的功能退出到父外壳脚本

来自分类Dev

为什么在源脚本中,“ exec不存在的文件”会退出外壳?

来自分类Dev

保留源外壳脚本而不退出终端

来自分类Dev

在脚本中退出bash命令而不退出脚本

来自分类Dev

在脚本中退出bash命令而不退出脚本

来自分类Dev

为什么Ctrl-D(EOF)退出外壳?

来自分类Dev

退出外壳程序后,chdir(<directory>)不会更改目录

来自分类Dev

比康 不正确的退出外壳,在护林员中打开

来自分类Dev

您如何确定是否导出外壳变量?

来自分类Dev

只读TMOUT变量–一种解决方法,可以在无活动时禁用自动退出外壳程序

来自分类Dev

在采购脚本时,如何在不退出调用外壳的情况下跳过脚本的其余部分?

来自分类Dev

使用快捷方式退出外壳程序(不键入退出),可以正确关闭会话

来自分类Dev

使用快捷方式退出外壳程序(不键入退出),可以正确关闭会话

来自分类Dev

代码不退出外部for循环

来自分类Dev

代码不退出外部for循环

来自分类Dev

如何从python cli中退出容器外壳

来自分类Dev

不退出 shell 脚本

来自分类Dev

从菜单中调用退出脚本而不退出菜单

来自分类Dev

从菜单中调用退出脚本而不退出菜单

来自分类Dev

从子shell退出整个bash脚本

来自分类Dev

子脚本之一失败时不退出bash脚本

来自分类Dev

暂时退出Gvim从外壳开始

来自分类Dev

为什么(退出1)不退出脚本?

来自分类Dev

发送退出代码而不退出脚本

来自分类Dev

TCSH脚本不退出

来自分类Dev

CasperJS脚本永不退出

来自分类Dev

为什么此bash脚本不退出?

Related 相关文章

  1. 1

    从子外壳退出外壳脚本

  2. 2

    在不退出终端的情况下退出错误句柄功能中的外壳脚本

  3. 3

    从子外壳脚本中的功能退出到父外壳脚本

  4. 4

    为什么在源脚本中,“ exec不存在的文件”会退出外壳?

  5. 5

    保留源外壳脚本而不退出终端

  6. 6

    在脚本中退出bash命令而不退出脚本

  7. 7

    在脚本中退出bash命令而不退出脚本

  8. 8

    为什么Ctrl-D(EOF)退出外壳?

  9. 9

    退出外壳程序后,chdir(<directory>)不会更改目录

  10. 10

    比康 不正确的退出外壳,在护林员中打开

  11. 11

    您如何确定是否导出外壳变量?

  12. 12

    只读TMOUT变量–一种解决方法,可以在无活动时禁用自动退出外壳程序

  13. 13

    在采购脚本时,如何在不退出调用外壳的情况下跳过脚本的其余部分?

  14. 14

    使用快捷方式退出外壳程序(不键入退出),可以正确关闭会话

  15. 15

    使用快捷方式退出外壳程序(不键入退出),可以正确关闭会话

  16. 16

    代码不退出外部for循环

  17. 17

    代码不退出外部for循环

  18. 18

    如何从python cli中退出容器外壳

  19. 19

    不退出 shell 脚本

  20. 20

    从菜单中调用退出脚本而不退出菜单

  21. 21

    从菜单中调用退出脚本而不退出菜单

  22. 22

    从子shell退出整个bash脚本

  23. 23

    子脚本之一失败时不退出bash脚本

  24. 24

    暂时退出Gvim从外壳开始

  25. 25

    为什么(退出1)不退出脚本?

  26. 26

    发送退出代码而不退出脚本

  27. 27

    TCSH脚本不退出

  28. 28

    CasperJS脚本永不退出

  29. 29

    为什么此bash脚本不退出?

热门标签

归档