gpt4 book ai didi

bash - shell 脚本可以删除或覆盖自身吗?

转载 作者:行者123 更新时间:2023-11-29 08:52:18 24 4
gpt4 key购买 nike

#beginning of bashscript1.sh
source bashscript2.sh
echo $variable

这是源文件:

#beginning of bashscript2.sh
rm -f bashscript2.sh
variable = "integer of some kind"

如何处理 bash 脚本?它是先加载源文件然后删除它,还是变量在 bash 脚本 1 中有值?

最佳答案

在类 Unix 操作系统上,如果文件仍处于打开状态,则可以删除该文件。文件名将不再存在,但数据本身仍然存在,并且任何具有打开句柄的程序(包括 bash)都可以使用该句柄继续读取(甚至写入)。只有当最后一个程序关闭其句柄时,文件才真正被删除。

因此,从某种意义上说,是的,shell 脚本可以删除自身,但在该脚本执行完成之前,它不会真正被删除。

请注意,如果您覆盖 文件而不是删除文件,您会得到不同的结果。 Shell 可能(并且确实)使用缓冲来避免一次读取一个字节,但缓冲区的大小是有限的。如果文件内容的变化超出了 shell 已经读入内存的内容,它将看到新的内容。如果您检查系统的缓冲区大小,则可以创建一个简单的示例。在我的系统上,它恰好是 8 KiB。所以一个 shell 脚本包含

echo line 1
>test.sh
# (8167 random characters)
echo line 4

所以第二个数据 block 是“cho line 4”,在我的系统上,输出

$ bash test.shline 1test.sh: line 4: e: command not found

because the e has already been read, and the shell encountered EOF when trying to read the rest of the line.

Update: rici shows that with a different example of overwriting the file, the newly written contents do get used. Reworking that:

script="`tr 12 21 <test.sh`"
env echo "$script" >test.sh
echo toggle: 1

第二行故意不使用 bash 的内置 echo 命令,因为根据评论,这有时不会导致 bash 重新读取脚本,但恰恰是在它这样做的时候和我不清楚。 bash 在到达第三行时输出新写入的切换值。这个和我之前的例子之间的相关区别似乎是,在这里,bash 可以在到达第三行时寻找当前位置,而在我之前的例子中,这是不可能的,因为那个位置不再存在,因为文件是空。

关于bash - shell 脚本可以删除或覆盖自身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com