如何返回到源 bash 脚本?

     2023-02-22     213

关键词:

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

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

#!/bin/bash
source someneatscriptthatendsprematurely.sh

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

任何帮助表示赞赏!

【问题讨论】:

【参考方案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

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

【讨论】:

如何从 Bash 脚本中检查程序是不是存在?

】如何从Bash脚本中检查程序是不是存在?【英文标题】:HowcanIcheckifaprogramexistsfromaBashscript?如何从Bash脚本中检查程序是否存在?【发布时间】:2010-10-1004:59:30【问题描述】:我将如何验证程序是否存在,以返回错误并退出或继... 查看详情

如何安全地提前退出 bash 脚本?

】如何安全地提前退出bash脚本?【英文标题】:Howtosafelyexitearlyfromabashscript?【发布时间】:2019-01-3109:44:32【问题描述】:我知道在bash脚本(例如here)中有几个关于exit与return的问题。关于这个主题,但与现有问题不同,我相信... 查看详情

BASH:如何从函数中正确返回真假

】BASH:如何从函数中正确返回真假【英文标题】:BASH:Howtocorrectlyreturntrueandfalsefromafunction【发布时间】:2015-09-2903:41:01【问题描述】:我在bash脚本中有一个函数,如果进程正在运行,我想返回true,否则返回false。我的函数的代... 查看详情

如何测试用于设置新机器的 bash 脚本

】如何测试用于设置新机器的bash脚本【英文标题】:HowcanItestabashscriptforsettingupanewmachine【发布时间】:2021-10-1600:37:16【问题描述】:我有几个bash脚本可以自动执行新设备的设置过程,例如安装包、配置环境变量等我正在努力通... 查看详情

GWT:如何从 GWT_SERVLET 调用 SERVLET 以及如何将值从目标 servlet 返回到源 servlet?

】GWT:如何从GWT_SERVLET调用SERVLET以及如何将值从目标servlet返回到源servlet?【英文标题】:GWT:HowtocallSERVLETFROMGWT_SERVLETandHowtoreturnvaluefromtargetservlettosourceservlet?【发布时间】:2011-08-3108:27:56【问题描述】:我有2个servlet。一个在GWT... 查看详情

将 Python 脚本的返回值存储在 bash 脚本中

】将Python脚本的返回值存储在bash脚本中【英文标题】:storereturnvalueofaPythonscriptinabashscript【发布时间】:2012-08-0716:57:11【问题描述】:我想从bash脚本执行python脚本,并且我想将python脚本的输出存储在一个变量中。在我的python脚... 查看详情

bash脚本返回值应用(代码片段)

bash脚本返回值应用应该说bash脚本对于linux系统来说具有举足轻重的意义。这里不做展开,也不做bash脚本介绍。更多的是做一个例子,应用了bash脚本的以下特性:输入参数函数定义调用可执行命令脚本递归条件判断脚... 查看详情

Bash 没有存储返回的 PHP 变量 [重复]

】Bash没有存储返回的PHP变量[重复]【英文标题】:BashisnotstoringareturnedPHPvariable[duplicate]【发布时间】:2019-09-0209:17:47【问题描述】:我有一个bash脚本,我想将一个变量传递给PHP脚本,PHP脚本将执行并返回一些应该存储在bash变量... 查看详情

将python脚本的输出返回到bash变量[重复]

】将python脚本的输出返回到bash变量[重复]【英文标题】:Returningoutputfrompythonscripttobashvariable[duplicate]【发布时间】:2021-01-2203:26:45【问题描述】:我在shell脚本方面相对较新,我想对以下内容进行一些澄清。如果我有一个执行以... 查看详情

如何为应该从 cookie_jar 返回的 cookie 编写 bash bash 脚本

】如何为应该从cookie_jar返回的cookie编写bashbash脚本【英文标题】:Howtowritebashbashscriptforcookiethatshouldreturnsfromcookie_jar【发布时间】:2021-12-0303:02:24【问题描述】:这里是bash版本GNUbash,版本5.0.17这是猫-Acookie_jarITRUE^I/^IFALSE^I0^ITS01e14... 查看详情

从 Bash 脚本执行时,Python 函数返回不同的值

】从Bash脚本执行时,Python函数返回不同的值【英文标题】:PythonfunctionreturnsdifferentvalueswhenexecutedfromaBashscript【发布时间】:2021-05-0416:24:37【问题描述】:我有一个示例Python文件“Test_exit.py”:importosdeftest_exit():print(\'Line1.\\n\')prin... 查看详情

不过时的技术——bash脚本

...4.最后exit0,退出脚本。一个Linux命令执行后,都会有一个返回值,0表示命令执行成功,1表示命令执行过程中出错,根据错误的不同,还可能返回2、3、4等值。在Linux中,变量$?记录了上次命令的返回值。使用echo$?可以查看上次命... 查看详情

调查 000 从 bash 脚本中的 cURL 返回错误代码的原因 [重复]

】调查000从bash脚本中的cURL返回错误代码的原因[重复]【英文标题】:Investigatingcauseof000returnederrorcodefromcURLinbashscript[duplicate]【发布时间】:2019-04-1915:48:12【问题描述】:我正在使用cURL在bash脚本中检查链接的正常运行时间,如下... 查看详情

使用 --help 参数调用的 bash 脚本应该返回 0 还是非零退出代码? [关闭]

】使用--help参数调用的bash脚本应该返回0还是非零退出代码?[关闭]【英文标题】:Shouldbashscriptscalledwith--helpargumentreturn0ornot-zeroexitcode?[closed]【发布时间】:2018-05-2811:30:16【问题描述】:编写一个bash脚本,在使用--help参数调用时... 查看详情

如何使用 python send cmd 保持 bash 数组有效 [重复]

】如何使用pythonsendcmd保持bash数组有效[重复]【英文标题】:Howtokeepbasharrayvalidwithpythonsendcmd[duplicate]【发布时间】:2021-10-0809:51:20【问题描述】:我在bash脚本中有一个数组。该脚本通过pythonsend命令执行,并在执行脚本的数组行时... 查看详情

Bash 脚本对两个但相反的字符串测试都返回 true

】Bash脚本对两个但相反的字符串测试都返回true【英文标题】:BashScriptisreturningtrueforbothbutoppositestringtests【发布时间】:2012-12-1102:49:48【问题描述】:在我运行之前输入的脚本#exportCPIC_MAX_CONV=500下面是test1.script文件#!/bin/bashfunction... 查看详情

如何在路径有空格的另一个 bash 脚本中运行 bash 脚本?

】如何在路径有空格的另一个bash脚本中运行bash脚本?【英文标题】:Howtorunbashscriptinsideanotherbashscriptwherepathhasspaces?【发布时间】:2021-08-2800:49:44【问题描述】:您好,我正在尝试从另一个bash脚本中调用一个bash脚本。结构如下... 查看详情

如何使用 adb 在 bash 脚本中以读写方式重新安装我的 Android/系统?

】如何使用adb在bash脚本中以读写方式重新安装我的Android/系统?【英文标题】:HowcanIremountmyAndroid/systemasread-writeinabashscriptusingadb?【发布时间】:2015-03-1613:52:39【问题描述】:了解详情adbremount返回"remountfailed:Operationnotpermitted&q... 查看详情