Что на самом деле происходит то, что Баш держит файл открытым и 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
Файл не открыт до сих пор, даже если вы больше не можете видеть это в латах. Так что это не то, что bash читает весь файл - это просто не так, пока bash не будет с ним.
Когда приложение выполняется, его код загружается в память. Вы просто удаляете файл на диске, который не влияет на код в памяти. –
Предположительно весь сценарий считывается в память при выполнении, поэтому команды после 'rm test.sh' все еще существуют в памяти для выполнения. – MrMisterMan
Это не делает копию в памяти. Так, например, если скрипт изменен во время его запуска, он выполнит изменения. Это дало мне головную боль в последнее время. Симпатичный пример: этот однострочный скрипт будет заполнять ваш диск в короткие сроки: «cat $ 0 >> $ 0». – Ned