自我删除bash脚本

时间:2011-10-20 10:35:48

标签: bash self-destruction

即使在遇到要删除自身的语句后,bash脚本如何执行? 例如,当我运行test.sh脚本时,该脚本具有以下功能:

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

end

脚本在删除之前执行到结束

2 个答案:

答案 0 :(得分:24)

实际发生的事情是bash会保持文件处于打开状态,rm不会停止。

所以rm调用libc函数“unlink()”,这将从它所在的目录中删除inode的“链接”。这个“链接”实际上是一个文件名和一个inode号(你可以使用ls -i)查看inode编号。

只要程序打开它就会存在inode。

您可以按照以下方式轻松测试此声明:

$ 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完成它才真正消失。

答案 1 :(得分:-1)

实际上,这种现象特定于shell(比如bash),它将文件读入内存然后执行它们。

如果执行以下a.bat: 回声Yo1 del a.bat 回声Yo2

您将获得以下输出: C:&GT; a.bat

C:&gt; echo Yo1 YO1

C:&gt; del a.bat 无法找到批处理文件。

这是您的期望: - )