【问题标题】:How do you return to a sourced bash script?如何返回到源 bash 脚本?
【发布时间】:2011-04-09 16:08:42
【问题描述】:

我在 bash 脚本中使用“source”,如下所示:

#!/bin/bash
source someneatscriptthatendsprematurely.sh

我想退出 someneatscriptthatendsprematurely.sh 脚本,而不退出主脚本。

任何帮助表示赞赏!

【问题讨论】:

    标签: bash subprocess return exit


    【解决方案1】:

    您需要return 声明:

    return [n]

    导致函数以n 指定的返回值退出。如果省略n,则返回状态为函数体中最后执行的命令的状态。如果在函数外部使用,但在 .(源)命令执行脚本期间,它会导致 shell 停止执行该脚本并返回 n 或在脚本中执行的最后一个命令的退出状态为脚本的退出状态。如果在函数外部而不是在. 执行脚本期间使用,则返回状态为假。任何与 RETURN 陷阱相关的命令都会在函数或脚本之后继续执行之前执行。

    您可以通过以下两个脚本看到这一点:

    script1.sh:
        . script2.sh
        echo hello again
    
    script2.sh:
        echo hello
        return
        echo goodbye
    

    当您运行script1.sh 时,您会看到:

    hello
    hello again
    

    【讨论】:

    • 请注意,如果可以,默认情况下您应该明确return 0。不这样做会导致父脚本出现不良行为。即[ -z "non-existant-file" ] && return 实际上会返回 1。
    • @BrettRyan 你的例子的问题是[ -z "non-existant-file" ] && return 0 将返回1。所以告诉人们明确地return 0 然后展示一个不起作用的例子是令人困惑的。
    • Brett,这在我发布的示例中并不重要,因为调用脚本实际上并没有以任何方式检查返回值(例如,if$?set -e)。无论如何,我很确定我所引用的引述在这种情况下清楚地表明了这种行为。
    【解决方案2】:

    您可以更改环境变量是否重要?因为否则你可以通过在没有源代码的情况下执行脚本来执行它:

    someneatscriptthatendsprematurely.sh
    

    【讨论】:

      【解决方案3】:

      我刚才也遇到了同样的问题

      我意识到添加一个检查器函数并返回它不会也返回它的调用者的函数,例如。

      关于 bash_functions

      function install_packer_linux() {
        check_wget && check_unzip
        wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
        unzip packer_1.1.2_linux_amd64.zip
        mv packer ~/.local/bin
        rm -f packer_1.1.2_linux_amd64.zip
      }
      
      
      function check_unzip() {
        if ! [ -x "$(command -v unzip)" ]; then
          echo "Error: unzip is not installed"
          return 1
        else
          return 0
        fi
      }
      
      function check_wget() {
        if ! [ -x "$(command -v wget)" ]; then
          echo "Error!: wget is not installed"
          return 1
        else
          return 0
        fi
      }
      
      
      $ source ~/.bash_functions
      

      这里发生的事情是因为检查器是它返回的唯一位置,所以 install_packer_linux 仍将继续

      所以你可以在这里做两件事。要么保持当前格式(函数调用另一个函数)原样并使用真值进行评估,然后如果值不是真值则返回,或者重写主 installer_packer_linux 函数上的检查器

      真相:

      function install_packer_linux() {
        check_wget && check_unzip || return
        wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip
        unzip packer_1.1.2_linux_amd64.zip
        mv packer ~/.local/bin
        rm -f packer_1.1.2_linux_amd64.zip
      }
      

      注意我们添加了||在检查后返回并使用 && 连接检查 所以如果不是两个检查都是真的,我们返回函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-07
        • 2018-07-02
        • 2022-10-14
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        相关资源
        最近更新 更多