29

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

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

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

VAR1 会有一些基于 foo 的值。

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

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

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

那可能吗?如何?

4

7 回答 7

23

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

于 2016-07-20T13:17:58.830 回答
22

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

于 2011-05-01T14:15:32.517 回答
9

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

  • smartcd 完全用 shell 编写,并且完全兼容 bash 和 zsh,甚至更深奥的选项

  • smartcd 将在目录层次结构中一直向下和向上运行脚本,直至它们的共同祖先,而不仅仅是您进入和离开的两个目录。这意味着您可以拥有一个 ~/foo 脚本,无论您是“cd ~/foo”还是“cd ~/foo/bar”,它都会执行

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

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

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

于 2011-06-15T04:31:04.377 回答
2

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

于 2011-05-01T14:26:41.260 回答
0

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

于 2011-05-01T14:05:26.663 回答
0

How about wrap your script with a function (the function can be placed either in your bash profile/bashrc file in the system ones to make available for all the users ).

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

Hence the function myscript will call the real "myscript" knowing what to do based on the current working directory.

Take this as an example:

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
于 2011-05-01T17:10:36.490 回答
0

这并不漂亮,但您可以使用导出的环境变量和$PWD.

例如:

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

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

于 2011-05-01T14:55:48.183 回答