aspettare
è un comando che attende il completamento dei lavori specificati e restituisce lo stato di uscita del comando atteso.
Dal momento che aspettare
comando influenza l'ambiente di esecuzione della shell corrente, è implementato come comando integrato nella maggior parte delle shell.
In questo articolo, esploreremo il built-in Bash aspettare
comando.
bash aspettare
Comando #
La sintassi generale di aspettare
built-in assume la forma seguente:
aspetta [opzioni] ID
ID
è l'ID del processo o del lavoro. se no ID
è specificato, il comando attende il completamento di tutti i processi in background figlio.
Il aspettare
comando restituisce lo stato di uscita dell'ultimo comando atteso.
Ad esempio, per attendere un processo in background con PID 7654
, useresti:
aspetta 7654
Quando vengono dati più processi, il comando attende il completamento di tutti i processi.
I lavori vengono specificati utilizzando la specifica del lavoro ("jobspec"), che è un modo per fare riferimento ai processi che compongono il lavoro. Una specifica del lavoro inizia con un simbolo di percentuale seguito dal numero del lavoro (%n
). Ecco un esempio:
Esegui un comando in background:
rsync -a /home /tmp/home &
L'ID del processo shell (racchiuso tra parentesi) e l'ID del processo verranno visualizzati sul tuo terminale:
[2] 54377
Per attendere il lavoro, eseguire il aspettare
comando seguito dalla specifica del lavoro:
aspetta %2
Quando viene invocato con il -n
opzione, il comando attende solo il completamento di un singolo job dai dati pid o jobspecs e restituisce il suo stato di uscita. Se non vengono forniti argomenti, aspetta -n
attende il completamento di qualsiasi lavoro in background e restituisce lo stato di uscita del lavoro.
aspetta -n 45432 54346 76573
Nell'esempio sopra, aspetta -n
stampa solo lo stato di ritorno del lavoro che esce per primo; non mostra il PID del lavoro. Se vuoi ottenere il pid del lavoro o il jobspec per il quale viene restituito lo stato di uscita, usa il pulsante -p
opzione per assegnarlo a una variabile:
wait -p job_id -n 45432 54346 76573
-p
l'opzione è stata introdotta in Bash 5.1. Se utilizzi una versione precedente di Bash, riceverai un errore di "opzione non valida".
Il -f
opzione dice aspettare
attendere che ogni pid o jobspec termini effettivamente prima di restituire il suo codice di uscita, piuttosto che tornare quando lo stato del lavoro viene modificato. Questa opzione è valida solo quando è abilitato il controllo del lavoro. Per impostazione predefinita, il controllo dei lavori è abilitato solo per i prompt interattivi.
Esempi #
aspettare
è tipicamente usato negli script di shell che generano processi figlio che vengono eseguiti in parallelo.
Per illustrare come funziona il comando, crea il seguente script:
#!/bin/bash sleep 30 & process_id=$! echo "PID: $id_processo" wait $id_processo echo "Stato di uscita: $?"
Spieghiamo il codice riga per riga:
- La prima riga si chiama shebang e dice al sistema operativo quale interprete usare per analizzare il resto del file.
- Stiamo usando il
dormire
comando per emulare un lungo processo in background. $!
è una variabile Bash interna che memorizza il PID dell'ultimo lavoro eseguito in background. In questo esempio, questo è il PID didormire
comando. Stiamo memorizzando il PID in una variabile (id_processo
).- Stampa il numero PID.
- Il PID viene passato al
aspettare
comando che attende ildormire
comando completato. - Stampa lo stato di uscita del
aspettare
comando.$?
è una variabile Bash interna che contiene lo stato di uscita dell'ultimo comando eseguito.
Se esegui lo script, stamperà qualcosa del genere:
PID: 36353 Stato di uscita: 0
Ecco un esempio usando il -n
opzione:
#!/bin/bash sleep 3 & sleep 30 & sleep 5 & wait -n echo "Primo lavoro completato." wait echo "Tutti i lavori sono stati completati."
Quando lo script viene eseguito, genera 3 processi in background. aspetta -n
attende il completamento del primo lavoro e la stampa dell'istruzione echo. aspettare
attende il completamento di tutti i processi in background figlio.
primo lavoro completato tutti i lavori completati
L'ultimo esempio spiega il -f
opzione. Apri il terminale ed esegui:
dormire 3600 e
[1] 46671
Attendi il processo:
aspetta 46671
Apri un altro terminale e interrompi il processo con il uccidere
comando:
uccidere -STOP 46671
Una volta modificato lo stato del processo, il, aspettare
il comando completerà e restituirà il codice di uscita del processo.
Ora ripeti gli stessi passaggi, ma questa volta usa aspetta -f $pid
:
dormire 3600 e
aspetta -f 46671
Interrompi il processo dall'altro terminale:
uccidere -STOP 46671
Questa volta il aspettare
il comando non verrà completato. Funzionerà fino al dormire
il processo termina.
Conclusione #
Il aspettare
il comando attende il completamento dei lavori specificati e restituisce il codice di uscita del lavoro.
Se hai domande o commenti, non esitare a lasciare un commento.