【问题标题】:Replacement for source in sh替换 sh 中的源
【发布时间】:2011-06-11 13:23:48
【问题描述】:

我需要设置环境变量,通常我们这样做

source script.sh

但是现在,我在引导过程中将其自动化,它看起来像默认情况下使用sh shell 引导的根。如何在 sh 中获取此脚本?

【问题讨论】:

    标签: bash shell sh dot-source


    【解决方案1】:

    tl;dr 对于sh(相对于bash),参数必须包含斜线:source ./script.sh,而不仅仅是source script.sh。除非script.sh 可以在PATH 中找到。

    点 (.) 命令存在于 bashsh 中。此外,bash 将其别名为source。来自bash手册:

    https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-source

    来源

    source filename
    

    . 的同义词(请参阅 Bourne Shell 内置函数)。

    https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-_002e

    。 (句号)

    . filename [arguments]
    

    从当前 shell 上下文中的 filename 参数读取并执行命令。如果filename 不包含斜线,则PATH 变量用于查找文件名。当 Bash 不处于 POSIX 模式时,如果在 $PATH 中找不到 filename,则搜索当前目录。

    来自POSIX

    如果file 不包含/,shell 将使用PATH 指定的搜索路径来查找包含文件的目录。然而,与普通命令搜索不同的是,点实用程序搜索的文件不需要是可执行文件。

    【讨论】:

      【解决方案2】:

      点命令“.”等效于 C Shell(和 Bash)source 命令。它由 POSIX 指定(参见 dot),并由 Bourne 和 Korn shell(我相信还有 zsh)支持。

      . somefile
      

      请注意,shell 使用$PATH 查找文件,但文件必须是可读的,而不是可执行的。

      如下面的 cmets 中所述,您当然可以为文件指定相对或绝对路径名 - 使用 $PATH 将不会搜索任何包含斜杠的名称。所以:

      . /some/where/somefile
      . some/where/somefile
      . ./somefile
      

      如果somefile 存在于三个不同的指定位置,都可以用来查找它(如果您可以将. 替换为ls -l 并查看列出的文件)。

      全世界的书呆子联合起来!是的,如果当前目录是根目录,那么 /some/where/somefile./some/where/somefile 将引用同一个文件 - 具有相同的真实路径 - 即使没有链接,符号或硬链接,发挥作用(../../some/where/somefile )。

      【讨论】:

        猜你喜欢
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-09
        • 2018-04-30
        相关资源
        最近更新 更多