[SHELL] background e foreground
Non riesco a capire questo script, o meglio, non mi torna l output. Se lo eseguo senza la mia & ottengo l output in foreground, ma se invece metto & (dovrei farlo svolgere in background giusto?) ottengo solo 5 e al rigo dopo, 4.
Perche?
echo "0 1 2 3 4 5 "| for i in $(cat);do [ $i -gt 3 ] && echo $i[b]&[/b] done
Perche?
Risposte
~$ echo " 0 1 2 3 4 5 6 7 8 9 10" | for i in $(cat); do [ $i -gt 3 ] && echo $i; done 4 5 6 7 8 9 10 utente@utente:~$ echo " 0 1 2 3 4 5 6 7 8 9 10" | for i in $(cat); do [ $i -gt 3 ] && echo $i& done 4 5 utente@utente:~$ 6 7 9 8 10
Ecco, perche ho questo output? Cioè capisco che mettere un comando in bg, "restituisca immediatamente il controllo alla shell", ma non mi torna questo output. Mi stampa subito 4 5 poi restituisce il comando alla shell che mi stampa 6 e dopo "a caso" gli altri numeri ? O.o
Quando dici che il controllo ritorna immediatamente alla shell vuol dire che torna al ciclo for prima di aver terminato il programma 'echo' (che stampa il valore di i). Quindi il tuo ciclo esegue 7 volte il programma 'echo' ma senza aspettare che finisca, e poi termina riportandoti al prompt. Ma intanto i programmi 'echo' sono in esecuzione e prima o poi stamperanno il valore di i e termineranno.
Quando mandi in background qualcosa è lo scheduler dei processi che decide quando eseguirlo. Nel tuo esempio lo scheduler prima esegue alcuni programmi 'echo', stampando 4 e 5, poi esegue la tua shell, stampando il prompt "utente@utente:~$", poi riprende ad eseguire i restanti programmi 'echo', stampando 6, 7, 8, 9, 10. In generale non puoi mai fare affidamento sull'ordine di esecuzione dei processi; il fatto stesso che i numeri siano comunque in ordine è casuale.
Quando mandi in background qualcosa è lo scheduler dei processi che decide quando eseguirlo. Nel tuo esempio lo scheduler prima esegue alcuni programmi 'echo', stampando 4 e 5, poi esegue la tua shell, stampando il prompt "utente@utente:~$", poi riprende ad eseguire i restanti programmi 'echo', stampando 6, 7, 8, 9, 10. In generale non puoi mai fare affidamento sull'ordine di esecuzione dei processi; il fatto stesso che i numeri siano comunque in ordine è casuale.
ok, ho capito, quindi in teoria se avessi avuto, anziche echo $i, un comando ben piu oneroso, non avrei avuto lo stesso output, in quanto ci metteva un po' a macinare tutto...
Visto che ci sono mi chiedevo, di preciso quali e quanti processi vengono eseguiti? 1 comando = 1 processo ? o non è detto? io immagino:
1)pipe
2)for
3)cat
4)if
5)echo
Puo essere? l'echo iniziale non lo considero visto che c'è la pipe...
Visto che ci sono mi chiedevo, di preciso quali e quanti processi vengono eseguiti? 1 comando = 1 processo ? o non è detto? io immagino:
1)pipe
2)for
3)cat
4)if
5)echo
Puo essere? l'echo iniziale non lo considero visto che c'è la pipe...
Il comando 'which' (o anche 'whereis') cerca l'argomento nel path di sistema:
echo, cat, [ sono programmi esterni*, mentre for, if e la pipe sono comandi interni di bash.
* In realtà la shell potrebbe anche avere dei comandi interni con lo stesso nome. In bash esiste il comando echo che "sovrascrive" quello di sistema (vedi anche man echo). Credo che valga anche per [.
which echo > /bin/echo which for > which: no for in (/bin:/usr/bin) which cat > /bin/cat which if > which: no if in (/bin:/usr/bin) which [ > /usr/bin/[
echo, cat, [ sono programmi esterni*, mentre for, if e la pipe sono comandi interni di bash.
* In realtà la shell potrebbe anche avere dei comandi interni con lo stesso nome. In bash esiste il comando echo che "sovrascrive" quello di sistema (vedi anche man echo). Credo che valga anche per [.
Ti ringrazio. Ma supponiamo che io non conosca la tua ultima nota (*), a quel punto vorrebbe dire che i miei processi sono, echo, cat e [ mentre gli altri, essendo built-in, sono scritti direttamente nel codice della shell e non generano un processo giusto?.
Confermami se ho capito. quello che intendi perche vorrei capire per bene questa cosa...
p.s. E se non avessi avuto which, ci sarebbe stato qualhe altro metodo per scoprire quali processi erano implicati...?
Grazie ancora.
Confermami se ho capito. quello che intendi perche vorrei capire per bene questa cosa...
p.s. E se non avessi avuto which, ci sarebbe stato qualhe altro metodo per scoprire quali processi erano implicati...?
Grazie ancora.
"starsuper":
Ti ringrazio. Ma supponiamo che io non conosca la tua ultima nota (*), a quel punto vorrebbe dire che i miei processi sono, echo, cat e [ mentre gli altri, essendo built-in, sono scritti direttamente nel codice della shell e non generano un processo giusto?.
Sì.
p.s. E se non avessi avuto which, ci sarebbe stato qualhe altro metodo per scoprire quali processi erano implicati...?
which e whereis sono comandi standard; non mi ricordo a che pacchetto appartengono ma dovresti trovarli dappertutto. Ma appunto il fatto che esiste un eseguibile 'echo' non vuol dire che la shell non lo abbia implementato internamente. Credo che l'unico modo sia osservare direttamente i processi creati (con top o ps).