【问题标题】:Reset / Reloading bash, completely (alias and function)完全重置/重新加载 bash(别名和函数)
【发布时间】:2013-03-05 11:13:08
【问题描述】:

我想重置 shell,在我注销/登录时,从头开始重新加载别名、函数。

但不要谈论source ~/.bashrc. ~/.bashrc

为什么?因为source. 只是用新的函数、别名等丰富了当前的shell。


仅供参考,你可以把这个函数放在你的 bashrc 中:

function foo {
  echo "foo";
}

然后执行source ~/.bashrc. ~/.bashrc。是的,foo 正在工作。然后现在,编辑您的.bashrc,并将 foo 替换为 bar,得到:

function bar {
  echo "bar";
}

您现在可以键入 foo,并看到 函数 foo 仍在工作,尽管它在 .bashrc 文件中不再存在。这就是我想表明的观点。


我尝试了exec bash;,但它没有加载.bashrc 文件。而exec bash;source ~/.bashrc; 显然不起作用,因为exec 杀死了当前进程(source 永远不会被调用)。

【问题讨论】:

  • 你试过 bash --login 吗?
  • +1 @BigMike 这会创建一个新的 bash 实例,就像您刚刚登录一样。这是您想要的吗?
  • 该死的,你很好。请写bash --login在甜蜜的答案@BigMike,我可以选择你!

标签: bash unix exec


【解决方案1】:

如我所愿

bash --login 

注意:如果您在终端(xterm 等)内运行 bash,您还需要向终端提供 -ls 参数(或等效参数)。 (例如xterm -ls

【讨论】:

  • 只有一件事,每次下一次登录都会运行另一个 bash 进程,而旧的仍在运行。否则很好。
  • 是的,因为您实际上正在启动一个新的 bash 进程。但是,您可以杀死旧的并分离,但这通常涉及一些 shell 技巧。
  • 所以exec bash --login 会杀死当前的bash,并开始一个新的,对吧?为了避免@Michal Trybus 通知。
  • @Ash_ 从技术上讲,它不会杀死当前的 bash:当前的 bash 会被新的 bash 替换。所以通俗地说就是被杀了。
  • 有了这个将丢失正在运行的作业,直到退出“递归编辑”
【解决方案2】:

编写以下脚本:

while true; do
    bash
    if [ $? -ne 123 ]; then
        break
    fi
done

设置可执行位并将其设置为您的 shell。 然后在您的~/.bashrc 中添加一个别名:

alias resetterm="exit 123"

这只需要一个额外的 bash 进程一直运行。每次重置时,都会运行一个新的 bash,而旧的进程将结束。

【讨论】:

  • 这个不错!在某些系统/带有某些外壳的情况下,我认为您不能保证会执行初始化脚本。
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2016-11-29
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2020-08-30
相关资源
最近更新 更多