Verwenden von Bash in OSX.
Mein Skript hat diese 2 Zeilen:
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}')
Wenn ich nach der ersten Zeile verwende &
(um die beiden rsync-Befehle parallel auszuführen), gibt mein späterer Aufruf $nfiles
nichts zurück.
Code:
osascript -e 'display notification "'$nfiles' files transferred to MASTER," & return & "'$nfiles2' transferred to BACKUP," & return & "Log Files Created" with title "Copy Complete"'
Ich kann nicht herausfinden, was los ist. Ich muss die beiden Rsyncs gleichzeitig ausführen.
Antwort1
Der Grund, warum Ihr Beispiel nicht funktioniert, liegt darin, dass der Hintergrundbefehl in einer Subshell-Umgebung ausgeführt wird und daher der Wert $nfiles
nicht verfügbar ist (d. h. in Ihrem Beispielcode geht er verloren).
Eine einfache Möglichkeit, dieses Problem zu umgehen, wäre die Verwendung einer temporären Datei. Im verallgemeinerten Beispielcode unten habe ich Ihre rsync
Pipelines durch einfachere Befehle ersetzt, die sleep
eine beliebige Zahl ausgeben:
# 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