Answers:
当您对脚本进行更改时,将在磁盘(硬盘-永久存储)上进行更改;当您执行脚本时,脚本将被加载到您的内存(RAM)中。
因此,您对脚本所做的更改不会影响正在运行的脚本,它将运行您执行这些更改之前执行的版本。
但是,当您再次执行更改的脚本而不终止先前正在运行的实例时,该脚本将有两个实例-一个具有更改的实例和一个旧的实例。
警告该脚本使用和修改的资源将发生冲突。例如,如果您正在使用脚本修改文件,则稍后运行的脚本将无法打开该文件进行写入,并且无法正确执行。
更新: 感谢注册用户向我指出了Unix.stackexchange.com上的一个更好的答案。
根据脚本的大小以及所讨论的编译器/解释器的不同,脚本会部分/完全加载。因此,如果未完全加载脚本,则将脚本的一部分加载到内存后,对脚本所做的更改将反映在正在运行的实例上。
因此,建议不要在当前正在运行的磁盘上更改脚本以获取不可预测的输出:首先停止正在运行的实例,然后修改脚本,然后重新执行脚本。
我将添加我认为其他答案中未提及的内容。在很大程度上取决于您如何编辑文件。这样做echo "stuff" >file
从壳(另一个实例)确实将覆盖该文件,我想。但是,如果您使用例如编辑文件emacs
然后保存,则不会发生这种情况。而是在这里,编辑器将旧文件重命名为某个备份名称(也许实际上是删除了先前的备份),然后使用旧名称(现已释放)将其修改后的缓冲区内容写为新文件。由于读取脚本的外壳程序(或其他解释程序)几乎肯定只能打开一次文件,因此此后与文件名的下落无关,它只是继续读取打开时与文件名关联的物理磁盘文件(由inode编号标识)。因此,即使它以块的形式读取脚本(如果使用缓冲文本I / O,这将是最简单的解决方案),它将继续从文件的旧实例中读取行,这在您的编辑中可能不会更改。
emacs
吗?
@jobin的答案通常是正确的,但我将添加一些其他答案,具体取决于您想做什么。
如果您想更改脚本,并且想知道它是安全的,那么您想写入一个新文件,而不是现有文件,但是新文件可以位于旧文件所在的位置。将新版本写入新文件,然后用于mv
将其移到旧文件的顶部。被替换的文件仍然存在,只是没有从目录链接。您正在运行的脚本可以继续使用它,并且当该脚本关闭其文件句柄时,系统知道它可以安全地清除文件(无论是立即清除还是以后清除)。
如果要动态地执行脚本的行为,则会遇到更困难的问题。我希望您需要将其构建到脚本代码中。Bash脚本可以处理信号(例如,可以捕获kill -USR1 [pid]
),然后脚本可以通过重新加载一些代码来做出响应。因此,也许您可以获得接近所需功能的功能,但是却不知道所追求的是什么,我看不出这样做的充分理由,而且我怀疑您是否想做这种复杂的事情,您可能想要更复杂的东西编程语言来实现。
如果您想破解没有考虑到这一点而编写的运行脚本的行为,那么您就不走运了。我会毫不犹豫地说任何编程任务都是不可能的,但是如果您有足够的资源和技能来执行此类任务,那么大概就不会在这里问了。