bash—从后台函数返回状态



我有一个大致如下结构的bash脚本:

function download {
# download a big file
}
function prepare_stuff {
# prepare some stuff
}
function process_download {
# process the downloaded file
}
download & prepare_stuff & wait
process_download

它做的第一件事是下载一个几百兆字节的文件。在下载过程中,还会在后台准备一些其他内容。当这两个都完成后,将处理下载。

download可能以三种不同的方式完成:

  1. 下载失败(例如,无法访问服务器)
  2. 文件已成功下载
  3. 自上次下载以来,服务器上的文件未更改

情况 1 是错误条件(在这种情况下,函数应返回与零不同的内容),而 2 和 3 则不是(即返回值应为零)。

现在,我希望process_download遇到情况 1 或 3 时跳过实际处理,所以我需要从download传递某种状态。由于download在子外壳中运行,因此变量将不起作用(赋值在子外壳中进行,不会传递回父外壳)。

如何将某种值从子外壳中的函数传递回父外壳?

你可以这样做:

download &
download_pid=$!
prepare_stuff &
prepare_pid=$!
result=0
wait $download_pid || result=$?
wait $prepare_pid

然后,result将包含您之前下载命令的返回代码,并且两个后台作业都将完成,您可以执行以下操作:

[[ $result = 0 ]] || process_download

通过澄清你的第三个条件,我可以使答案更完整。

我最终做了一些类似于弗雷德建议的事情。

首先,我放弃了"服务器上的文件未更改 = 没有错误"的想法,现在使用返回代码来表示我们是否有要处理的下载 - 如果下载了新文件,则为 0,如果下载失败或没有更改,则为 1。这样处理要简单得多。

然后:

function download {
# download a big file
# return nonzero if download failed
# else return nonzero if file has not changed
# else return 0 (download successful, file has changed)
}
function prepare_stuff {
# prepare some stuff
}
function process_download {
# process the downloaded file
}
download &
PID_DOWNLOAD=$!
prepare_stuff &
PID_PREPARE_STUFF=$!
wait $PID_PREPARE_STUFF
wait $PID_DOWNLOAD && process_download || echo "Nothing to process."

最新更新