我怎样才能获得系统(" source~ / .bash_profile")'使用当前的shell?

时间:2015-01-01 13:58:45

标签: ruby linux bash shell

我正在以编程方式更新bash文件。在脚本结束时,我调用system("source ~/.bash_profile")来获取bash文件。但是,bash文件未在当前shell中更新。

经过一些研究,我发现system()在子shell中执行。因此(我认为)当前的shell没有使用最新的bash文件进行更新。

似乎其他调用shell命令的方法也不会在当前shell中执行它们。即反引号,execopen3open4

如何在不打开新shell的情况下调用将更新当前shell的shell命令(以打破当前的工作流程)?

我正在查看这些命令,包括

source ~/.bash_profile

alias something="echo something"

更新:建议的答案有效。因此,我正在调用system("kill -SIGUSR1 #{Process.ppid}")来获取.bash_profile。请注意,如果您使用的是mac,则应将建议的代码放在.bash_profile上,而不是.bashrc

2 个答案:

答案 0 :(得分:1)

.bashrc .bash_profile:

sigusr1() {
   source ~/.bash_profile
   echo 'wow! I feel refreshed!'
}

trap sigusr1 SIGUSR1

现在,从您的程序中,找出bash pid(可能只是getppid())并使用kill()将SIGUSR1发送给它。

如果您拍摄错误的过程,您将获得乐趣!这是建立新联系的一种方式,特别是那些刚刚让他们的进程被杀的人。

答案 1 :(得分:0)

从shell运行的程序中,您无法在父shell中获取脚本。

当从{shell}直接运行时,source命令或类似的别名会导致更改在当前shell中生效。但在这种情况下,您需要仔细编写您的个人资料/ rc,以便安全地重新运行。