bash:动态环境控制

bash:动态环境控制

我有一个修改环境变量的应用程序。目的是启动具有修改后的特定于上下文的环境的 bash shell。

当我的应用程序修改环境并使用修改后的环境执行“bash --noprofile --norc”时,我几乎得到了我想要的行为,除了别名被删除。如果我登录并直接从操作系统打开 shell,我会得到“正常”别名,但如果我的应用程序启动 bash,那么我不会得到任何别名,因为初始化文件被跳过。

有没有办法让 bash 从动态源初始化?换句话说,如果我可以让我的应用程序启动“bash”及其所有各种用户/设施设置(包括别名),然后在最后获取我的应用程序需要应用的差异,那将会很有帮助。理想情况下,这将为我的用户打开一个准备好的外壳。我没有从手册页中找到这个(或者也许理解它)。

在理想的情况下,我们可以重构用户/工厂设置以使其更具可重入性(了解应用程序,并跳过不需要再次发生的重新初始化步骤);但实际上这有点麻烦。

有什么建议么?谢谢。

答案1

您可以使您的 .bashrc 更加模块化(例如通过使用您的别名来获取 .aliasrc),然后让您的自定义环境仅获取您为该环境指定的模块。

答案2

bash --noprofile --norc <<ALIAS
$(alias)
exec </dev/tty
ALIAS

bash --noprofile...如果您从知道您的别名的位运行该位,那么应该可以做到这一点bash

否则你可以按照@WilliamEverett的建议做(我相信,这最终是更好的方法)。促进这一点的一种方法是:

alias >~/.aliasrc
{   cp ~/.bashrc ~/.bashrc.old
    grep -v '^ *alias' <~/.bashrc.old
    echo '. ~/.aliasrc'
} >~/.bashrc

您需要在生成的 rc 文件和它保存的 .old 文件之间进行一些比较,以防某些alias定义是多行的。排序后,您可以:

bash --noprofile --rcfile ~/.aliasrc

答案3

你可以把

if [ -f ~/.Mayur_Patel_special ]
then
    . ~/.Mayur_Patel_special
    rm ~/.Mayur_Patel_special
fi

在你的末尾.bashrc,然后让你的应用程序创建该文件。并且,显然,运行bash 没有--noprofile选项--norc。如果可能有多个实例同时运行,请使文件名唯一;例如,通过合并 PID。

相关内容