我正在尝试更改的行为,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
几点:-
PATH
conda
直到函数被实际调用时才会更新。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