python - 在运行时编辑 shell 脚本和 python 脚本
问题描述
最近,我发现了一篇关于在运行时编辑 shell 脚本的文章。
我准备了该代码以通过额外的 python 脚本调用来重现该现象。我发现echo
在 bash 中不受编辑影响,而 python 脚本受到影响。
有人可以解释这种现象吗?我期望所有的标准输出都应该被“修改”。
- 测试.sh
#!/bin/bash
sleep 30
echo "not modified"
python my_python.py
echo "not modified"
- my_python.py
print("not modified")
- 输出结果
$ bash test.sh // while sleeping, I edited test.sh and my_python.py to "modified"
not modified
modified
not modified
解决方案
bash 脚本已经加载到内存中并正在执行,直到下次运行时才会影响结果。python脚本尚未加载,修改后加载到内存中。
如果您执行相反的操作并从等效的 python 脚本启动 bash 脚本,您将获得相同的反向行为。
编辑 05/10/2020
正如戈登戴维森所指出的那样;
“不同版本的 bash 做不同的事情。有些在执行时逐字节读取文件,有些我认为以 8KB 块加载它(不一定是整个文件),有些做更复杂的事情(AIUI 它也可以取决于他们正在运行的操作系统)。请参阅我的答案覆盖正在执行的 bash 脚本文件。最终结果:不要指望任何特定行为。”
也就是说,OP 的操作系统行为似乎表明了解释当前行为的脚本的完整加载,尽管不能保证这一点。
推荐阅读
- python - 为什么`script.py <(cat *.gz)`在python 2中与subprocess.Popen一起工作,但在python 3中却不行?
- flutter - 将 onPressed 函数放在 Container 上
- java - 我可以使用 java 从 spark UDF 返回一个 java 对象吗
- r - 如何根据公共列的计数从两个不同的数据帧中抽取样本?
- javascript - 字符 '+' 在 base64 编码数据中转换为 +
- javascript - 单击 datetimepicker 中的日期时获取值
- azure - 为 APIM 下的所有 API 实例创建请求速率限制
- d3.js - 如何突出显示多个圆环图 d3 的一部分
- distance - 如何在行为空间中报告从补丁到海龟的距离?
- awk - 涉及awk的一行代码分解