Job Control: 백그라운드 작업의 출력을 변수에 저장하는 방법

Job Control: 백그라운드 작업의 출력을 변수에 저장하는 방법

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

관련 정보