Самостоятельно удаляющий скрипт 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 Пакетный файл не найден.

Это в соответствии с вашими ожиданиями:-)

Другие вопросы по тегам