Самостоятельно удаляющий скрипт bash - PullRequest
13 голосов
/ 20 октября 2011

Как bash-скрипт может выполняться даже после обнаружения оператора для удаления самого себя? Например, когда я запустил скрипт test.sh, который содержит:

<--some commands-->
rm test.sh
<--some more commands-->

end

Сценарий выполняется до конца перед удалением

Ответы [ 2 ]

24 голосов
/ 20 октября 2011

На самом деле происходит то, что bash сохраняет файл открытым, и rm не останавливает его.

Так что rm вызывает функцию libc "unlink ()", которая удаляет "ссылку"на 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 с ним не закончит.

0 голосов
/ 20 октября 2011

Фактически, это явление характерно для оболочек (например, bash), которые считывают файл в память и затем выполняют их.

Если вы выполните следующее a.bat: эхо Yo1 del a.bat эхо Yo2

Вы получите следующий вывод: C:> a.bat

C:> эхо Yo1 YO1

C:> del a.bat Пакетный файл не найден.

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

...