为什么在 Bash 函数之前选择基于 PATH 的脚本?

为什么在 Bash 函数之前选择基于 PATH 的脚本?

我正在尝试更改的行为,conda首先更新$PATH安装miniconda- 然后运行命令。这是因为我的大部分工作python不是使用conda版本,我想保留PYTHONPATH。因此,这是 bash 函数:

$type conda
conda is a function
conda ()
{
    CONDA=~/miniconda2;
    export PATH=$CONDA/bin:$PATH;
    $CONDA/bin/conda $@
}

这个功能有人用吗?

$which conda
/usr/local/bin/conda

不是。那么——为什么conda拿起以前的 $PATH基于可执行文件而不是 bash 函数?

我在macos sierra

答案1

几点:-

  • PATHconda直到函数被实际调用时才会更新。
  • PATH将于每一个 conda呼叫,发出不断增加的声音PATH
  • 您对二进制文件的调用conda包含目录引用,因此不使用PATH,那么为什么要尝试更新它呢?

如果你需要更新PATH你应该检查它是否有必要,给出类似的信息:

CONDA=~/miniconda2
[ ${PATH#*$CONDA/bin} == $PATH ] && export PATH=$CONDA/bin:$PATH
conda () { $CONDA/bin/conda $@; }

换句话说,运行环境设置命令声明conda()中,而不是声明内部。

答案2

AFH 的答案是正确的,但没有回答直接的问题。直接答案是:基于 PATH 的脚本不是在 bash 函数之前选择。该which命令不会告诉您 shell 将执行什么,它只是搜索PATH. type(这是 bash 内置命令)会告诉您输入该命令时实际会发生什么。以下是一个简单的演示:

$ type democmd
democmd is a function
democmd () 
{ 
    echo "This is the democmd *function*."
}
$ which democmd
/usr/local/bin/democmd
$ more /usr/local/bin/democmd
#!/bin/bash
echo "This is the democmd *script*, running from /usr/local/bin"
$ democmd
This is the democmd *function*.
$ command democmd    # The "command" command ignores aliases and functions
This is the democmd *script*, running from /usr/local/bin

相关内容