基于目录的环境变量范围 - 如何实现?

时间:2011-05-01 13:58:15

标签: bash scope environment-variables working-directory

我有一套工具,我需要根据我正在处理的项目传递参数。我希望能够根据当前目录自动设置几个环境变量。因此,当我在目录之间切换时,我常用的env vars也会改变。例如:

让我们当前的目录是foo,因此如果我这样做:

~/foo$ ./myscript --var1=$VAR1

VAR1会有一些基于foo的值。

然后,假设我切换到了bar目录。如果我这样做:

~/bar$ ./myscript --var1=$VAR1

VAR1现在应该有一些基于条形的值。

这可能吗?怎么样?

7 个答案:

答案 0 :(得分:17)

ondir程序允许您指定在终端中输入和离开目录时要运行的操作

答案 1 :(得分:8)

我已经写了另一个这个实现,有点类似于ondir。当我开始研究时,我实际上并不知道ondir。但是,有一些关键的差异可能会有用。

  • smartcd完全用shell编写,与bash和zsh完全兼容,即使是更深奥的选项

  • smartcd会将目录层次结构中的脚本向下运行到其共同的祖先,而不仅仅是您要进入和离开的两个目录。这意味着您可以使用〜/ foo脚本执行,无论您是“cd~ / foo”还是“cd~ / foo / bar”

  • 它具有“变量存储”,这是处理环境变量的一种更自动的方式,而ondir要求您明确地手动删除和/或重置变量

  • smartcd可以通过挂钩你的提示命令打开“autocd”(bash中的PROMPT_COMMAND,zsh中的precmd)

您可以在https://github.com/cxreg/smartcd

找到smartcd

答案 2 :(得分:8)

direnv可以帮助您轻松,优雅地完成这些工作。只需在项目目录中定义一个.envrc文件,其中包含所需的所有env变量,一旦你进入该文件夹,它就会获取它。

答案 3 :(得分:2)

这不是bash或任何其他常见shell的内置功能直接支持的内容。但是,您可以创建自己的“cd”命令,该命令将执行您想要的任何操作。例如,您可以使用别名cd来执行cd,然后运行特殊脚本(例如:〜/ bin / oncd)。该脚本可以在数据库中查找新目录并运行一些命令,或查看目录中是否有特殊文件(例如:.env)并加载它等等。

答案 4 :(得分:0)

我做了很多这样的事情。我在需要它们的目录中创建了几个同名的批处理文件,它们只设置变量并调用公共脚本。我甚至有一个创建其他小文件的批处理文件。

答案 5 :(得分:0)

这不是很好,但您可以使用导出的环境变量和$PWD的值的组合。

例如:

export VAR1=prefix
export prefix${HOME////_}_foo=42
export prefix${HOME////_}_bar=blah

然后myscript只需要eval echo \${$VAR1${PWD////_}}来获取基于目录的值。

答案 6 :(得分:0)

如何使用函数包装脚本(该函数可以放在系统文件中的bash profile / bashrc文件中,以供所有用户使用)。

myscript () { case $PWD in
/path/to/foo) path/to/myscript --var1=$VAR1 ;;
/path/to/bar) path/to/myscript --var2=$VAR1 ;;
*) ;;
case
}

因此,函数myscript将根据当前工作目录调用真正的“myscript”知道该怎么做。

以此为例:

hmontoliu@ulises:/tmp$ myscript () { case $PWD in /tmp) echo I\'m in tmp;; /var) echo I\'m in var;; *) echo I\'m neither in tmp nor in bar; esac; }
hmontoliu@ulises:/tmp$ myscript 
I'm in tmp
hmontoliu@ulises:/tmp$ cd /var
hmontoliu@ulises:/var$ myscript 
I'm in var
hmontoliu@ulises:/var$ cd /etc
hmontoliu@ulises:/etc$ myscript 
I'm neither in tmp nor in bar