即使遇到删除自身的语句,bash脚本如何执行?例如,当我运行 test.sh 脚本时,它包含:
<--some commands-->
rm test.sh
<--some more commands-->
end
脚本执行到最后,然后自行删除
即使遇到删除自身的语句,bash脚本如何执行?例如,当我运行 test.sh 脚本时,它包含:
<--some commands-->
rm test.sh
<--some more commands-->
end
脚本执行到最后,然后自行删除
实际发生的是 bash 保持文件打开并且rm
不会停止。
所以rm
调用 libc 函数“unlink()”,它将从它所在的目录中删除指向 inode 的“链接”。这个“链接”实际上是一个文件名和一个 inode 编号(您可以看到 inode 编号ls -i
)。
只要程序打开它,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 完成之前并没有真正消失。
实际上,这种现象是特定于 shell(如 bash)的,它将文件读入内存然后执行它们。
如果执行以下a.bat: echo Yo1 del a.bat echo Yo2
你得到以下输出: C:>a.bat
C:>回声 Yo1 Yo1
C:>del a.bat 找不到批处理文件。
这符合您的期望:-)