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.