最近,我遇到了Linux命令source
,然后找到this answer它的功能。
我的理解是source
执行传递给它的文件,它确实适用于简单的shell脚本。然后我尝试在Python脚本上使用source
- 但它不起作用。
Python脚本有一个shebang(例如#!/usr/bin/python
),我可以执行./python.py
,因为脚本具有可执行权限。如果可能,source python.py
也应该是可能的,对吧?唯一的区别是./
在新shell中执行,source
在当前shell中执行。为什么它不适用于.py
脚本?我在这里错过了什么吗?
答案 0 :(得分:5)
您仍然没有完全了解source
的内容。
source
确实从当前shell进程中的文件执行命令。它有效地实现了这一点,就好像您已将它们直接输入到当前shell中一样。
这是必要的原因是因为当你运行一个shell脚本而没有获取它时,它会产生一个子shell--一个新的进程。当此进程退出时,在返回到它生成的shell时,该脚本中所做的任何更改都将丢失。
接下来,您无法将Python导入shell,因为Python解释器始终与shell不同。运行Python脚本会产生一个全新的流程,当该流程退出时,其状态就会丢失。
当然,如果你的shell 实际上是 Python(我不推荐!),你仍然可以"来源"进入它 - 使用import
。
答案 1 :(得分:2)
source
执行文件并将在该脚本中创建的任何函数/别名/环境变量放在调用它的shell中。它通过不生成新进程来执行此操作,而是在当前进程中执行脚本。
shell使用shabang来指示生成新进程的内容,因此对于source
它将被忽略,并且该文件被解释为当前进程的语言(bash
在这种情况下)。这就是为什么在python文件上使用source
失败的原因。