将目录添加到所有类似 PATH 的变量

将目录添加到所有类似 PATH 的变量

是否有一个函数可以将根文件夹添加到所有类似路径的变量中?目前我使用这个功能:

function prepend_paths() {
    ROOT_PATH=$(readlink -f $1)
    export PATH=$ROOT_PATH/bin:$PATH
    export LD_LIBARY_PATH=$ROOT_PATH/lib:$LD_LIBARY_PATH
    export LD_LIBARY_PATH=$ROOT_PATH/lib64:$LD_LIBARY_PATH
    export C_INCLUDE_PATH=$ROOT_PATH/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=$ROOT_PATH/include:$CPLUS_INCLUDE_PATH
    export PYTHONPATH=$ROOT_PATH/lib/python3.5/site-packages:$PYTHONPATH
    export MANPATH=$ROOT_PATH/share/man:$MANPATH
}

但不知道是否详尽。

我不可能是唯一一个偶尔喜欢这种功能的人,所以我认为一定是某种预先存在的方法来做到这一点。但到目前为止我还没有找到任何东西。

答案1

请注意,这export与赋值不同。听起来您想要执行以下操作

function prepend_paths() {
    for P in $(env | grep PATH | sed 's/=.*//') ; do
        eval $P=${1}:\$$P ;
    done
}

即,将给定前缀添加到名称中带有“PATH”的所有环境变量中。嵌入式$(env ..)子命令提供变量名称列表。 for 循环体中的工作线通过调用执行赋值eval,这可以方便地执行双重计算P(首先进入变量名称,然后进入该变量的值)。

然后,这些赋值将保存在“this shell”中,并且所有已标记为“导出”的变量将被传播到子进程。当然,export $P如果您愿意,您可以添加明确的语句,如果您认为这是一件好事,也可以打印输出来报告作业。

答案2

问题是否“这是详尽无遗的?”很有趣。这个PATH类似变量的列表怎么可能是详尽无遗的呢?你PATH上面提到的,大多数 shell 都尊重这一点。并且LD_LIBARY_PATH也受到大多数计划的认可。PYTHONPATHPython 可执行文件确实很荣幸。但是,既然您不知道明天要安装哪个程序,那么您如何知道之前PATH要设置哪个类似变量呢?

我想到了 Java,CLASSPATH还有suwith ENV_ROOTPATH。但是,让我们来构建一个假设的程序foo.exe——SOME_WEIRD_PATH_VARIABLE_NAME我们之前如何知道这个变量呢?也许其他一些程序会尊重另一个PATH类似的变量,PATH_SET但并不期望该变量被设置为文件路径但可能希望将其设置为10。我们不知道PATH_SET要设置什么pwd,嗯? :-)

相关内容