在bash中递归覆盖rc文件

时间:2012-03-06 07:42:38

标签: linux bash unix ssh

这类似于目录的.htaccess。

我有以下内容:

文件:〜/ .myapprc

APP_USER=alagu
APP_DOMAIN=goyaka.com

文件:〜/ testapp / .myapprc

APP_USER=alagu_test
APP_DOMAIN=localhost

我想要的是什么:

[alagu@~ ]$ echo $APP_USER
alagu

[alagu@~ ]$ cd ~/testapp
[alagu@~ ]$ echo $APP_USER
alagu_test

我该如何完成这项工作?

3 个答案:

答案 0 :(得分:3)

在您更改目录时,您似乎希望获得.myapprc

我可以考虑使用两种途径 - PROMPT_COMMANDDEBUG陷阱。

要使用第一个执行此操作,您将运行以下一次:

PROMPT_COMMAND="[ -f .myapprc ] && . .myapprc"

和第二个:

trap "[ -f .myapprc ] && . .myapprc" DEBUG

这些文件会在每次提示时获取一次文件,因此如果获取该文件的费用很高,您可以将其扩展以检查$PWD是否已更改。

你也可以覆盖cd,但这可能会破坏一些shell脚本:

alias cd=cd_
function cd_
{
    \cd "$@"
    local ret=$?
    [ -f .myapprc ] && . .myapprc
    return $ret
}

但是做任何这些都不是一个好主意 - 嘿,这些都是巨大的安全漏洞,因为你最终会在.myapprc中运行任何命令工作目录是。


Joachim的后期编辑 - 将此与PROMPT_COMMAND / trap解决方案一起使用,可以避免过度执行.myapprc,具体如下: PROMPT_COMMAND='if [ -f .myapprc -a "$PWD" != "$PWDLAST" ]; then PWDLAST="$PWD"; source .myapprc; fi'


答案 1 :(得分:2)

您可以在.bashrc中创建一个覆盖cd命令的函数:

cd() {
    # "$@" to preserve quoting/whitespace
    builtin cd "$@"
    [ -f ".myapprc" ] && source .myapprc
}

答案 2 :(得分:1)

您可以使用direnv根据工作目录自定义您的环境。它位于http://direnv.net