2015-01-01 21 views
1

我正在以编程方式更新bash文件。在脚本的最后,我打电话system("source ~/.bash_profile")来源bash文件。但是,bash文件在当前shell中未得到更新。如何获取'system(“source〜/ .bash_profile”)'以使用当前shell?

经过一番研究,我发现system()子shell中执行。因此(我认为)当前shell不会更新最新的bash文件。

看来,调用shell命令的其他方法也不会在当前shell中执行它们。即反引号,exec,open3,open4

如何调用一个shell命令,将更新当前的shell,而不打开一个新的外壳(打破目前的工作流程)?

我在看这些命令包括

source ~/.bash_profile 

更新:建议的答复工作。因此,我要求system("kill -SIGUSR1 #{Process.ppid}")来源.bash_profile。需要注意的是,如果你是在Mac上,你应该放在.bash_profile建议的代码,而不是.bashrc

回答

1

在你的.bashrc .bash_profile文件

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

trap sigusr1 SIGUSR1 

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

如果你拍摄错误的过程,你会很开心!这是建立新联系人的一种方式,特别是那些刚刚完成流程的人。

+0

感谢您的回答。但发送杀死-SIGUSR1似乎只是杀死了bash进程。并打印“[处理完成]”。我正在使用mac。我错过了什么吗? – ytbryan

+1

有没有可用于Mac的bash?使用我刚才编写的代码将SIGUSR1捕获到shell中非常重要。你可以通过输入命令“trap”来验证它是否工作 - 它应该显示你在SIGUSR1上执行的功能 –

+1

太好了!它就像一个魅力! 所以我基本上把这段代码放在.bash_profile而不是.bashrc中,因为mac使用.bash_profile而不是.bashrc。 – ytbryan

0

从shell中运行的程序不能从父shell中获取脚本。

source命令或类似别名将,从壳直接运行时使得所述更改生效在当前shell虽然。但是在那种情况下,你需要仔细写出你的profile/rc,以便安全地重新运行。