Ответ 1
Что на самом деле происходит, так это то, что bash сохраняет файл открытым, а rm
не будет останавливаться.
Итак, rm
вызывает функцию libc "unlink()", которая удаляет "ссылку" в inode из каталога, в котором она находится. Эта "ссылка" на самом деле является именем файла вместе с номером inode (вы можете видеть номера inode с ls -i
).
Индекс существует до тех пор, пока программы открывают его.
Вы можете легко проверить это требование следующим образом:
$ echo read a> ni
$ bash ni
а в другом окне:
$ 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
Файл все еще открыт, хотя вы больше не видите его в ls. Так что это не то, что bash читает весь файл - он просто не прошел до тех пор, пока с ним не будет выполнено bash.