你如何回到源bash脚本?

时间:2010-09-08 10:39:45

标签: bash subprocess return exit

我使用的是使用bash源功能扩展的脚本;

#!/bin/bash

source someneatscriptthatendsprematurely.sh

我希望能够在不破坏主脚本的情况下从该脚本返回。

使用退出中断主脚本,返回仅在函数中有效,并且试验$(退出1)似乎也不起作用。

那么,是否可以在不破坏主bash的情况下返回子bash脚本?

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:67)

您需要return声明:

  

return [n]

     

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

您可以使用以下两个脚本查看此操作:

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

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

hello
hello again

答案 1 :(得分:1)

您是否可以更改环境变量?否则你只需执行脚本就可以执行脚本:

someneatscriptthatendsprematurely.sh

答案 2 :(得分:0)

我刚才遇到同样的问题

我意识到添加一个checker函数并返回它也不会在其调用者身上返回该函数。

关于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仍将继续

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

Truthy:

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
}

注意我们添加了||检查后返回,并使用&& amp; 因此,如果不是两个检查都是真实的,我们返回函数