【问题标题】:Recursively override a rc file in bash递归覆盖bash中的rc文件
【发布时间】:2014-12-02 22:22:38
【问题描述】:

这类似于目录的 .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

我该如何完成这项工作?

【问题讨论】:

    标签: linux bash unix ssh


    【解决方案1】:

    看起来您想在每次更改目录时获取 .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'


    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 使用"$@"而不是"$*"来避免引用问题。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 2016-01-31
        • 2018-07-11
        • 1970-01-01
        相关资源
        最近更新 更多