Voglio scrivere una funzione di indicatore di avanzamento all'interno del mio script che esegue il loop di un messaggio "please wait" fino a quando l'attività che lo ha chiamato non è terminata.Come faccio a visualizzare una funzione di indicatore di avanzamento in uno script di shell?
Voglio che sia una funzione in modo che possa riutilizzarla in altri script.
Per ottenere ciò, la funzione deve essere liberamente associata ad altre funzioni, vale a dire che la funzione che la chiama non deve conoscere il suo codice interno.
Ecco quello che ho finora. Questa funzione riceve il pid del chiamante e dei loop fino al completamento dell'attività.
function progress() {
pid="$1"
kill -n 0 "${pid}" &> /dev/null && echo -ne "please wait"
while kill -n 0 "${pid}" &> /dev/null ; do
echo -n "."
sleep 1
done
}
Funziona bene quando lo si utilizza in uno script, come ad esempio:
#imports the shell script with the progress() function
. /path/to/progress.sh
echo "testing"
# $$ returns the pid of the script.
progress $$ &
sleep 5
echo "done"
uscita:
$ testing
$ please wait.....
$ done
Il problema è quando lo chiamo io da un'altra funzione, come funzioni non avere pid:
function my_func() {
progress $$ &
echo "my func is done"
}
. /path/to/progress.sh
echo "testing"
my_func
sleep 10
echo done
Uscita:
$ testing
$ please wait.....
$ my func. is done.
$ ..........
$ done
questo è vicino al mio precedente tentativo, ma stavo cercando di evitare di doverlo uccidere al di fuori della mia funzione progress() ... Forse non può essere fatto con uno script di shell, però. Grazie! – Tarek
Ciao, ho provato il codice fornito, ma soffre dello stesso problema da quando SIGTERM viene inviato quando il programma è terminato. Non posso usarlo all'interno di una funzione a meno che non invii esplicitamente il segnale kill. – Tarek
@Tarek non capisco cosa intendi con "all'interno di una funzione" e "se non mandare l'uccisione" ... ma: ho modificato lo script mostrando come usarlo all'interno di una funzione, e per il secondo, ovviamente tu __need__ invia un segnale - in qualche modo devi dire al processo in background: "fermati ora" .... Se intendi qualcosa di diverso - non può aiutare ... – jm666