我正在以编程方式更新bash文件。在脚本结束时,我调用system("source ~/.bash_profile")
来获取bash文件。但是,bash文件未在当前shell中更新。
经过一些研究,我发现system()
在子shell中执行。因此(我认为)当前的shell没有使用最新的bash文件进行更新。
似乎其他调用shell命令的方法也不会在当前shell中执行它们。即反引号,exec
,open3
,open4
。
如何在不打开新shell的情况下调用将更新当前shell的shell命令(以打破当前的工作流程)?
我正在查看这些命令,包括
source ~/.bash_profile
或
alias something="echo something"
更新:建议的答案有效。因此,我正在调用system("kill -SIGUSR1 #{Process.ppid}")
来获取.bash_profile。请注意,如果您使用的是mac,则应将建议的代码放在.bash_profile
上,而不是.bashrc
答案 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,以便安全地重新运行。