【问题标题】:why does "source ~/.profile" keep adding to my $PATH?为什么“source ~/.profile”不断添加到我的 $PATH 中?
【发布时间】:2016-10-18 09:26:04
【问题描述】:

这对我没有任何影响,只是出于好奇……

我已将export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin 添加到我的 ~/.profile 中,以便在我的 bash 搜索中包含一个新目录。

然后,我运行 $ source ~/.profile 重新加载 may shell,并使用 $ echo $PATH 检查了我的路径

问题是:
- 为什么每次我运行source ~/.profile,它都会再次附加相同的信息,
- 我怎样才能清除它?

我尝试过的:
- 尝试多次运行它并不断添加相同的
- 试图弄清楚source 命令做了什么但找不到它在哪里which source

【问题讨论】:

  • 不要在每个 shell 会话中多次获取 ~/.profile。不过,PATH 中的重复条目并没有真正伤害任何东西。

标签: linux bash path


【解决方案1】:

第一个问题:

为什么每次我运行 source ~/.profile 时,它​​都会附加相同的内容 再次信息

简单地说,source <FILE> 不会重新加载你的 shell。它只是 执行保存在<FILE> 中的所有命令,就好像它们是直接键入的一样 由你在终端。

第二个问题:

如何清除?

要重新加载 shell 打开一个新终端 窗口/选项卡。只做bash 或exec bash 是行不通的,因为新的 进程将继承其父环境。

第三个问题:

试图弄清楚源命令做了什么但不能 找出它在哪一个来源

正如我在这里解释过一次https://unix.stackexchange.com/a/202326/72304:

无需输入显式路径即可在 Bash 中运行的所有命令 对它如 ./command 可以分为两部分: Bash shell 内置命令和外部命令。已安装 Bash shell 内置函数 使用 Bash 并且是其中的一部分,而外部命令不是其中的一部分 重击。这很重要,因为记录了 Bash shell 内置函数 在 man bash 中,他们的文档也可以在帮助下调用 命令,而外部命令通常记录在自己的文件中 手册页或采取一些 -h,--help 标志之王。检查是否有 command 是 Bash shell 内置或外部命令:

$  type local 
 local is a shell builtin

如果用作命令,它将显示如何解释命令 名称(来自帮助类型)。在这里我们可以看到 local 是一个内置的 shell。 再看一个例子:

$ type vim 
vim is /usr/bin/vim

在你的情况下:

$ type source
source is a shell builtin

现在我们知道它不是一个外部命令,而是一个 shell bultin(这就是为什么 which 找不到它)所以我们需要使用 help 来看看它做了什么:

$ help source 
    source: source filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

【讨论】:

    【解决方案2】:

    source 在当前 shell 中执行作为参数传递的文件的内容。

    它再次附加相同的信息,因为export 将一个字符串附加到PATH,而不检查任何内容(它不检查您要附加的子字符串是否已经在变量中)。

    为避免每次都附加到 PATH,您应该保存 PATH 的值而不引用自身,例如:

    export PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/local/go/bin:$GOPATH/bin
    

    编辑: 检查目录是否已经在 PATH 中:

    if [[ ":$PATH:" != *":/usr/local/go/bin:$GOPATH/bin:"* ]]; then
        export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
    fi
    

    【讨论】:

    • 这不会覆盖此导出之前对 $PATH 的任何先前分配吗?
    • 当然可以,如果您想使用当前 PATH,请参阅我更新的答案。
    猜你喜欢
    • 2016-04-26
    • 2012-05-06
    • 1970-01-01
    • 2012-07-09
    • 2020-12-02
    • 1970-01-01
    • 2017-02-24
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多