1

Recently, I came across the Linux command source and then found this answer on what it does.

My understanding was that source executes the file that is passed to it, and it did work for a simple shell script. Then I tried using source on a Python script–but it did not work.

The Python script has a shebang (e.g. #!/usr/bin/python) and I am able to do a ./python.py, as the script has executable permission. If that is possible, source python.py should also be possible, right? The only difference is ./ executes in a new shell and source executes in the current shell. Why is it not working on a .py script? Am I missing something here?

4

2 回答 2

6

您仍然没有完全准确地了解source它的作用。

source确实从当前 shell 进程中的文件执行命令。它可以有效地执行此操作,就好像您已将它们直接输入到当前的 shell 中一样。

这是必要的原因是因为当你运行一个 shell 脚本而不使用它时,它会产生一个子 shell——一个新进程。当此进程退出时,在该脚本中所做的任何更改都将丢失,因为您返回到生成它的 shell。

因此,您不能将 Python 源代码放入 shell,因为 Python 解释器始终是与您的 shell 不同的进程。运行 Python 脚本会产生一个全新的进程,当该进程退出时,它的状态就会丢失。

当然,如果你的 shell实际上是 Python(我不推荐!),你仍然可以“源”到它里面——通过使用import.

于 2013-09-02T16:40:03.377 回答
2

source执行文件并将在该脚本中创建的任何函数/别名/环境变量放在调用它的 shell 中。它通过不产生新进程,而是在当前进程中执行脚本来做到这一点。

shell 使用 shabang 来指示使用什么来生成新进程,因此source它被忽略,并且文件被解释为当前进程的语言(bash在这种情况下)。这就是为什么source在 python 文件上使用失败的原因。

于 2013-09-02T16:43:18.687 回答