首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在bash脚本(.sh)文件运行时修改它吗?

我可以在bash脚本(.sh)文件运行时修改它吗?
EN

Ask Ubuntu用户
提问于 2014-06-16 14:22:02
回答 5查看 33K关注 0票数 49

假设我有一个脚本script.sh,它需要一些时间来执行。我执行了,./script.sh。当它在终端窗口中运行时,我修改文件script.sh。这会对已经在运行的进程产生任何影响吗?

修改后,我执行修改后的文件,因此我现在有两个正在运行的进程。这样可以吗?

EN

回答 5

Ask Ubuntu用户

回答已采纳

发布于 2014-06-16 14:24:41

更新:感谢注册用户为我提供了一个更好的Unix.stackexchange.com答案。

根据脚本的大小和所讨论的编译器/解释器,脚本部分/全部加载。因此,如果脚本没有完全加载,那么一旦将脚本的部分加载到内存中,您对脚本所做的更改将反映正在运行的实例。

因此,不建议更改当前运行的磁盘上的脚本,以进行不可预测的输出:首先停止运行实例,然后修改脚本,然后重新执行脚本。

初步答案:当您更改您的脚本时,您在磁盘上进行更改(硬盘-永久存储);当您执行该脚本时,脚本将加载到您的内存(RAM)中。

因此,您对脚本所做的更改不会影响正在运行的脚本,它将在进行这些更改之前运行您执行的版本。

但是,当您再次执行更改的脚本而不终止先前运行的实例时,将有两个脚本实例-一个有更改,另一个有旧的。

请注意,脚本使用和修改的资源将发生冲突。例如,如果使用脚本修改文件,则以后运行的脚本将无法打开该文件进行写入,并且无法正确执行。

票数 50
EN

Ask Ubuntu用户

发布于 2017-03-12 15:53:12

这一点需要更新,以上答案现在只部分正确:

对于当前版本的bash,在运行时修改磁盘上的脚本将导致bash“尝试”将更改加载到内存中,并在运行的脚本中加载这些更改。如果您的更改发生在当前执行行之后,则将加载和执行新行。但是,这是由bash猜测,它可能是正确的或错误的。

更好的方法是以下操作序列: 1)将脚本加载到内存中;2)从磁盘中删除脚本;3)首先删除磁盘版本,将新脚本写入磁盘,这样,当您在步骤3中提供新版本时,不会尝试将新内容加载到内存版本中。

票数 13
EN

Ask Ubuntu用户

发布于 2014-06-16 16:52:20

我要补充一些我认为在其他答案中没有说过的话。这在很大程度上取决于您如何编辑文件。我认为,从shell (另一个实例)执行echo "stuff" >file确实会覆盖文件。但是,如果您使用例如emacs编辑文件,然后保存,则不会发生这种情况。相反,编辑器将旧文件重命名为某个备份名称(可能实际上删除了以前的备份),然后将其修改后的缓冲区内容写入一个新文件,该文件的旧名称(现在为libreated)。由于读取脚本的shell (或其他解释器)几乎肯定只打开文件一次,此后它将独立于文件名的下落,因此它只会继续读取打开时与文件名相关联的物理磁盘文件(由inode编号标识)。因此,即使它以块形式读取脚本(如果使用缓冲的文本I/O,这将是最简单的解决方案),它也将继续从文件的旧实例中读取行,这很可能不会因编辑而改变。

票数 6
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/484111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档