Conform intrebarii:
Ar putea variabila $? să fie suprascris când o altă comandă este executată între ele?
Raspunsul este DA. Variabila $? conţine starea de ieşire a ultimei sarcini. De exemplu:
$ fals; eco $?
1
$ fals; Adevărat; eco $?
0
$ fals; Adevărat; fals; eco $?
1
Ca variabila $! conține PID-ul ultimei sarcini de fundal.
Referinţă: Devhints.io: Cheatsheet pentru scripturi Bash
Conform intrebarii:
Este asteapta $oldpid încurcându-se cu modul asincron al nohup?
Nu ar trebui - nu este proiectat exact pentru astfel de sarcini? :)
Conform intrebarii:
Sau poate că această logică este pur și simplu stupidă și pur și simplu există o abordare mai bună?
Pentru mine nu este clar de ce împingi rsync în fundal și apoi aștepta pentru aceasta, în schimb, executați comanda și apoi faceți testul.
#!/bin/bash
rsync -a source.file destination.file 2>/dev/null
dacă [[ $? -eq 0]]; apoi ecou „SUCCES”; else ecou "FAILED"; fi
2>/dev/null este folosit aici pentru a suprima mesajele de eroare ale rsync, dar le puteți salva într-un fișier temporar și îl puteți atașa la e-mail. 
Dar probabil că nu este întregul scenariu...
În plus, în primele rânduri ale ajuta sa astepti sunt furnizate următoarele informații.
așteptați: așteptați [-fn] [id ...]
Așteptați finalizarea lucrării și reveniți la starea de ieșire.
Deci, puteți utiliza ieșirea lui aștepta direct în interiorul dacă afirmație. Am făcut deja un test de succes pentru această abordare.
#!/bin/bash
nohup rsync -a source.file destination.file 2>/dev/null &
oldpid=$!
daca asteapta $oldpid
atunci
        ecou „SUCCES”
altfel
        ecou "FAILED"
fi
2>/dev/null este folosit aici pentru a suprima mesajele de eroare ale nohup, in timp ce rsync mesajele de eroare merg undeva în fundal.