在 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