【发布时间】:2012-03-16 08:28:34
【问题描述】:
我想根据当前目录更改我的 PATH 变量。
对于一个项目,我正在使用一组我想运行的脚本,而无需指定脚本的完整路径。通常我会通过将“脚本”目录添加到 PATH 变量来做到这一点。
问题是,对于我的其他项目,我不想在我的 PATH 中包含这些脚本。有没有办法根据当前目录更改 PATH 变量?如果是这样,我很乐意学习。
【问题讨论】:
-
谢谢,这正是我想要的。再次发布它作为答案,我会接受它。
我想根据当前目录更改我的 PATH 变量。
对于一个项目,我正在使用一组我想运行的脚本,而无需指定脚本的完整路径。通常我会通过将“脚本”目录添加到 PATH 变量来做到这一点。
问题是,对于我的其他项目,我不想在我的 PATH 中包含这些脚本。有没有办法根据当前目录更改 PATH 变量?如果是这样,我很乐意学习。
【问题讨论】:
我想说,处理项目相关配置的常用方法是为每个项目都有一个配置脚本,并在处理该项目时获取它。此外,使用的配置脚本可能会更改提示,以便您只需查看它就知道给定 shell 的活动项目是什么。
【讨论】:
如果您需要修改后的路径只是为了方便您在控制台中工作,您可以覆盖cd:
function cd() {
builtin cd "$@"
case $(pwd) in
*/project1*) export PATH=somepath1;;
*/project2*) export PATH=somepath2;;
...
esac
}
export -f cd
这当然只有在您使用 shell 的 cd 命令更改目录时才有效,而不是在应用程序使用 C API 更改目录时。这段代码也有点棘手,因为您必须列出许多 PATH 值并确保合理处理您可能希望将 PATH 重置为原始值的“标准”目录(项目之外的目录)的情况。此外,您可能会遇到手动修改其 PATH 值的用户或脚本的交互。您设置的值应该包括这些值,但您需要在覆盖 cd 之前将 PATH 存储在一个临时变量中,例如 ORIG_PATH。
要点是:您要求的是可能的(如上图所示),但可能会引起混淆并需要一些工作。当您在 jcollado 建议的项目之间切换时获取的配置脚本是标准且更简洁的解决方案。
【讨论】:
来自 direnv.org
“direnv 项目旨在允许在你的 shell 中使用依赖于路径的环境变量。它有很多用途,但我将它用于具有项目特定的设置,以免弄乱我的 ~/.profile。我用它来指定ruby 版本,设置 AWS 或 SSH 密钥,..."
【讨论】: