从终端重新启动bash而不重新启动终端应用程序(mac)?


46

我四处张望,并想找到这个问题的答案,但我似乎没有找到它(这很奇怪)。

我的问题是,有没有一种简单的方法可以从Mac终端上重新启动bash会话。我只是想要与关闭终端应用程序并再次启动它相同的行为(所有变量都重置,.bash_profile源等)。

我知道如何获取.bash_profile,但这不是我想要的。我要执行此操作的原因之一是因为bash提示的插件具有防止多次加载颜色的代码。因此,采购.bash_profile不会重新加载颜色变量,并且我必须重新启动终端应用程序才能使更改生效。

Answers:


64

exec bash 应该用bash(的新实例)替换当前的shell进程。


2
终端应用程序中的bash是交互式shell,然后exec bash仅重新启动该交互式shell吗?另外,您能否确切说明exec命令的功能及其选项?谢谢!
Mattias

exec用新进程替换了当前进程。Bash的文章写得很好,但不幸的是很难搜索到手册页;类型man bash,找到字符串SHELL BUILTIN COMMANDS的最后一个实例,然后向下滚动到exec。简而言之,传递该-c标志将在没有任何环境变量的情况下运行它(我不知道这可能是出于您的目的所必需的),而其他参数-l和-a可能不是您想要的(它们似乎是历史性的) /晦涩和特定功能)。如果不使用命令,也可以使用exec在当前shell中打开新文件描述符。
Muzer

您能否显示一个示例,说明如何使用exec在当前shell中打开新文件描述符?那我关于交互式/登录shell的问题呢?是在终端中运行的外壳是交互式外壳,还是所有exec命令都涉及到。最后,问题的批准答案建议使用带有-l标志的exec命令,但我不知道它的作用。很抱歉问了这么多,我只是想了解我使用的命令。
Mattias

1
对不起,是的。我不确定Mac,但是在Linux世界中,至少从图形终端运行的外壳(通常)不是登录外壳,而您只是重新启动了交互式外壳,而不是终端本身或您的登录外壳。-l这是bash的一个参数,只是使其表现得像登录外壳一样。在当前shell中打开文件描述符与您的问题无关,但是您可以使用exec 4<>test.txt例如使文件描述符4指向test.txt。然后,在外壳程序的其余部分中,您可以echo test>&4输出到test.txt。
Muzer

1
由于我无法完全同意我的理由,@ Muzer 决定OSX决定GUI终端仿真器将运行登录shell
terdon

1

接受的答案对于使用bash的shell非常有用,这也是OP要求的,但是,我在具有非默认shell(zsh)的macOS上使用Terminal并运行命令exec bash显然没有达到预期的效果:它启动bash而不是我的默认shell。

因此,与环境无关的命令将exec $SHELL利用环境变量$SHELL为用户存储默认外壳程序。

另外,请注意,Apple将在macOS Catalina中用zsh替换bash,以使OP寻求运行效果,exec zsh或者exec $SHELL成为更新到macOS 10.15之后的一种方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.