作业控制:如何将后台作业的输出保存在变量中

作业控制:如何将后台作业的输出保存在变量中

在 OSX 中使用 Bash。

我的脚本有以下两行:

nfiles=$(rsync -auvh --stats --delete --progress --log-file="$SourceRoot/""CopyLog1.txt" "$SourceTx" "$Dest1Tx" | tee /dev/stderr | awk '/files transferred/{print $NF}') &
nfiles2=$(rsync -auvh --stats --delete --progress --log-file="$SourceRoot/""CopyLog2.txt" "$SourceTx" "$Dest2Tx" | tee /dev/stderr | awk '/files transferred/{print $NF}')

当我在第一行之后使用&(并行运行两个 rsync 命令)时,我稍后的调用不会$nfiles返回任何内容。

代码:

osascript -e 'display notification "'$nfiles' files transferred to MASTER," & return & "'$nfiles2' transferred to BACKUP," & return & "Log Files Created" with title "Copy Complete"'

无法弄清楚发生了什么事。我需要 2 个 rsync 同时运行。

答案1

您的示例不起作用的原因是因为后台命令是在子shell环境中执行的,因此 的值$nfiles将不可用(即:在您的示例代码中,它丢失了)。

解决此问题的一种简单方法是使用临时文件。在下面的通用示例代码中,我用rsync更简单的命令替换了管道,sleep并回显任意数字:

# use existing value of TMPDIR if exists, else set it to /tmp
: ${TMPDIR:=/tmp}

# ensure temporary file will be deleted on interrupt or error:
trap "rm -f $TMPDIR/nfiles.$$; exit 1" 1 2 3 15

# run the first command in background and save output to a temporary file:
(sleep 3; echo 1) > $TMPDIR/nfiles.$$ &

nfiles2=$(sleep 1; echo 2)

# wait for background command to complete:
wait

# save temporary file data in variables:
nfiles=$(cat $TMPDIR/nfiles.$$)

# remove the temp files on normal exit:
rm -f $TMPDIR/nfiles.$$

# $nfiles and $nfiles 2 should now contain the desired data
echo nfiles=$nfiles
echo nfiles2=$nfiles2

相关内容