OSX で Bash を使用する。
私のスクリプトには次の 2 行があります:
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}')
最初の行の後にを使用すると&
(2 つの 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
例が機能しない理由は、バックグラウンド コマンドがサブシェル環境で実行されるため、 の値が$nfiles
使用できないためです (つまり、サンプル コードでは失われます)。
この問題を回避する簡単な方法の 1 つは、一時ファイルを使用することです。以下の一般化されたサンプル コードでは、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