我有一个修改环境变量的应用程序。目的是启动具有修改后的特定于上下文的环境的 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。