假设我有一个脚本script.sh
,它需要一些时间来执行。我执行了,./script.sh
。当它在终端窗口中运行时,我修改文件script.sh
。这会对已经在运行的进程产生任何影响吗?
修改后,我执行修改后的文件,因此我现在有两个正在运行的进程。这样可以吗?
发布于 2014-06-16 14:24:41
更新:感谢注册用户为我提供了一个更好的Unix.stackexchange.com答案。
根据脚本的大小和所讨论的编译器/解释器,脚本部分/全部加载。因此,如果脚本没有完全加载,那么一旦将脚本的部分加载到内存中,您对脚本所做的更改将反映正在运行的实例。
因此,不建议更改当前运行的磁盘上的脚本,以进行不可预测的输出:首先停止运行实例,然后修改脚本,然后重新执行脚本。
初步答案:当您更改您的脚本时,您在磁盘上进行更改(硬盘-永久存储);当您执行该脚本时,脚本将加载到您的内存(RAM)中。
因此,您对脚本所做的更改不会影响正在运行的脚本,它将在进行这些更改之前运行您执行的版本。
但是,当您再次执行更改的脚本而不终止先前运行的实例时,将有两个脚本实例-一个有更改,另一个有旧的。
请注意,脚本使用和修改的资源将发生冲突。例如,如果使用脚本修改文件,则以后运行的脚本将无法打开该文件进行写入,并且无法正确执行。
发布于 2017-03-12 15:53:12
这一点需要更新,以上答案现在只部分正确:
对于当前版本的bash,在运行时修改磁盘上的脚本将导致bash“尝试”将更改加载到内存中,并在运行的脚本中加载这些更改。如果您的更改发生在当前执行行之后,则将加载和执行新行。但是,这是由bash猜测,它可能是正确的或错误的。
更好的方法是以下操作序列: 1)将脚本加载到内存中;2)从磁盘中删除脚本;3)首先删除磁盘版本,将新脚本写入磁盘,这样,当您在步骤3中提供新版本时,不会尝试将新内容加载到内存版本中。
发布于 2014-06-16 16:52:20
我要补充一些我认为在其他答案中没有说过的话。这在很大程度上取决于您如何编辑文件。我认为,从shell (另一个实例)执行echo "stuff" >file
确实会覆盖文件。但是,如果您使用例如emacs
编辑文件,然后保存,则不会发生这种情况。相反,编辑器将旧文件重命名为某个备份名称(可能实际上删除了以前的备份),然后将其修改后的缓冲区内容写入一个新文件,该文件的旧名称(现在为libreated)。由于读取脚本的shell (或其他解释器)几乎肯定只打开文件一次,此后它将独立于文件名的下落,因此它只会继续读取打开时与文件名相关联的物理磁盘文件(由inode编号标识)。因此,即使它以块形式读取脚本(如果使用缓冲的文本I/O,这将是最简单的解决方案),它也将继续从文件的旧实例中读取行,这很可能不会因编辑而改变。
https://askubuntu.com/questions/484111
复制相似问题