Quello che accade è che bash mantiene il file aperto e rm
non farà che si fermano.
Quindi rm
chiama la funzione libc "unlink()" che rimuoverà il "link" dall'inode dalla directory in cui si trova. Questo "link" è in realtà un nome file insieme a un numero di inode (puoi vedere inode numeri con ls -i
).
L'inode esiste finché i programmi lo aprono.
Si può facilmente verificare questa affermazione come segue:
$ echo read a> ni
$ bash ni
mentre in un'altra finestra:
$ pgrep -lf bash\ ni
31662 bash ni
$ lsof -p 31662|grep ni
bash 31662 wmertens 255r REG 14,2 7 12074052 /Users/wmertens/ni
$ rm ni
$ lsof -p 31662|grep ni
bash 31662 wmertens 255r REG 14,2 7 12074052 /Users/wmertens/ni
Il file è ancora aperto, anche se non è più possibile vederlo in ls. Quindi non è che bash leggi l'intero file - non è davvero andato via fino a quando bash non ha finito con esso.
Quando un'applicazione viene eseguita, il suo codice viene caricato in memoria. Stai semplicemente cancellando il file sul disco, che non influisce sul codice in memoria. –
Presumibilmente l'intero script viene letto in memoria al momento dell'esecuzione e quindi i comandi dopo 'rm test.sh' esistono ancora in memoria per essere eseguiti. – MrMisterMan
Non fa una copia in memoria. Ad esempio, se lo script viene modificato mentre è in esecuzione, eseguirà le modifiche. Questo mi ha fatto venire il mal di testa di recente. Simpatico esempio: questo script a una riga riempirà il tuo disco in breve tempo: 'cat $ 0 >> $ 0'. – Ned