Подтвердить что ты не робот

Самостоятельное удаление bash script

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

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

end

script выполняет до конца, прежде чем удалять себя

4b9b3361

Ответ 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.

Ответ 2

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

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

Вы получаете следующий результат: С: > a.bat

C: > echo Yo1 YO1

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

Это за ваше ожидание: -)