从该脚本中删除脚本文件是否安全?


9

想象我有一个剧本foo。当用户登录时,它应该运行一次,并且在成功运行后不需要。

我的问题:从脚本中删除脚本文件是否安全?

例如:

#!/bin/bash

# do something
...

# if successful
rm /path/to/foo
exit 0

2
并非完全无关,您可以#!/bin/bash -e用来确保仅在没有问题的情况下删除脚本文件。
sr_

3
是的,这很安全。如果你想知道,为什么,读stackoverflow.com/questions/2028874/...
jofel

2
@jofel听起来不错,我建议您将此作为答案。:-)
htorque

如有疑问,您可以用替换最后两行exec rm /path/to/foo
卡巴斯德(Kasperd)

Answers:


5

在运行外壳文件时可以安全地删除它,因为文件处理程序不受(重新)移动相应文件的影响。

有关更多信息,请参见此处


2
要知道,它可能无法工作,取决于你的系统(即rm <it-self>在HP-UX是不会成功的。
Ouki

1
@Ouki,为什么?那不会违反POSIX吗?
maxschlepzig 2012年

3
@maxschlepzig POSIX允许删除到当前正在执行的可执行文件的最后一个链接失败:unlink可能会失败ETXTBUSY。(奇怪的是,规范中未定义“纯过程”和“共享文本”; AFAIK表示可执行程序的组件:可执行文件本身或它使用的库)。除HP-UX之外的所有主要unice都允许对可执行文件进行重命名和取消链接。
吉尔斯(Gillles)“所以别再作恶了”,

2
@Ouki通过简单地以结束脚本,应该很容易解决exec rm /path/to/foo
卡巴斯德(Kasperd)

0

我对此一直很紧张,所以我做了:

(sleep 5; rm /path/to/shell/script) &
exit 0

或者,您可以链接到临时脚本:

echo >/tmp/rmme rm /path/to/shell/script
. /tmp/rmme

1
在两种建议的方法中,仍然存在一个Shell进程,该进程在脚本被删除时尚未完成执行。
卡巴斯德(Kasperd)

您想要做的是exec rm /path/to/shell/script
osvein
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.