【问题标题】:What occurs when a file is `source`-d in Unix/Linux context?当文件在 Unix/Linux 上下文中是 `source`-d 时会发生什么?
【发布时间】:2012-02-17 10:36:38
【问题描述】:

我见过包含如下一行的 shell 脚本:

source someOtherFile

我知道导致someOtherFile的内容执行,但是source的意义是什么?


后续问题:可以获取任何脚本,还是仅获取某些类型的脚本?获取脚本时(与正常执行脚本相反),除了环境变量之外是否还有其他副作用?

【问题讨论】:

标签: linux unix


【解决方案1】:

在脚本上运行命令source 会在当前进程的上下文中执行脚本。这意味着脚本设置的环境变量在完成运行后仍然可用。这与正常运行脚本不同,在这种情况下,在新生成的进程中设置的环境变量将在脚本退出后丢失。

您可以获取任何可运行的 shell 脚本。最终效果将与您在终端中键入脚本中的命令相同。例如,如果脚本改变了目录,当它完成运行时,你当前的工作目录将会改变。

【讨论】:

  • 可以获取任何脚本,还是只能获取某些类型的脚本?获取脚本时除了环境变量之外的任何副作用(而不是正常执行它)?另外,您的回答简洁易懂。谢谢!
  • 您可以获取任何 shell 脚本。脚本实际上是在您的进程中运行的事实会产生副作用。因此,如果它更改目录,您将看到您的密码更改。而仅仅执行一个 shell 脚本通常不会改变你的密码。
  • 我的文件中有一个长时间运行的脚本来获取源代码怎么办?它会完成吗?还是有默认的超时时间?
【解决方案2】:

如果你告诉 shell,例如bash,读取文件并执行文件中的命令,称为采购。重点是,当前进程(shell)这样做,而不是新的子进程。

在 BASH 中,您可以使用 source 命令或简单地使用 . 来获取文件。

【讨论】:

    【解决方案3】:

    source 是一个 Unix 命令,它评估命令后面的文件,作为命令列表,在当前上下文中执行。您也可以使用. 获取文件。

    source my-script.sh;
    . my-script.sh;
    

    这两个命令的效果是一样的。

    相比之下,将脚本文件名传递给所需的 shell 将在子 shell 中运行脚本,而不是在当前上下文中。

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2016-11-08
      • 2019-02-04
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多