Самостоятельно удаляющий скрипт bash
Как bash-скрипт может выполняться даже после того, как встретил оператор для удаления самого себя? Например, когда я запустил скрипт test.sh, который содержит:
<--some commands-->
rm test.sh
<--some more commands-->
end
Сценарий выполняется до конца перед удалением
2 ответа
Что на самом деле происходит, так это то, что bash сохраняет файл открытым и rm
не остановит это.
Так rm
вызывает функцию libc "unlink()", которая удалит "ссылку" на индекс из каталога, в котором он находится. Эта "ссылка" на самом деле является именем файла вместе с номером индекса (вы можете увидеть номера индексов с помощью 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 не завершит работу с ним.
Фактически, это явление характерно для оболочек (например, bash), которые считывают файл в память, а затем исполняют их.
Если вы выполните следующее a.bat: echo Yo1 del a.bat echo Yo2
Вы получите следующий вывод: C:> a.bat
C:> эхо Yo1 Yo1
C:> del a.bat Пакетный файл не найден.
Это в соответствии с вашими ожиданиями:-)