当 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()”,该函数将从目录中删除到i-node的链接。这个“链接”实际上是一个包含inode号码的文件名(您可以使用ls -i
查看inode号码)。
只要程序仍在使用i-node,它就会继续存在。
您可以轻松地测试此主张,方法如下:
$ 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完成处理后,该文件才真正被关闭。
rm test.sh
之后的命令仍然存在于内存中等待执行。 - punkrockbuddyholly