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
예제가 작동하지 않는 이유는 백그라운드 명령이 하위 쉘 환경에서 실행되어 값을 $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