如何在jupyterlab中使用当前用户的.bashrc文件登录bash?

7

我在 .bashrc 中设置了一个配置文件,我希望所有在我的 jupyterlab 中自动打开的终端都能应用这个配置。

目前,jupyterlab 终端是这样启动的,没有任何我 .bashrc 文件中的配置。

jupyterlab terminal

如果我只是输入 bash 并按回车键,它会做到我想要的。就像下面这样。

terminal after typing bash

我希望它自动像这样打开。

如何实现这一点?

这是一个非常相似的问题。

但是,没有一个解决方案可以正常工作,我的意思是它确实打开了 bash,而不是 shell,所以我不确定那个解决方案是否适合我。但是我已经更改了我的龙卷风设置,添加了环境变量 SHELL=/bin/bash,但是它对任何事情都没有影响(我显然每次都重新启动了 jupyterhub 以查看效果)。

这是我在 '/etc/systemd/' 中的 jupyterhub 启动文件 'jupyterhub.service'。

[Unit]
Description=Jupyterhub
After=syslog.target network.target
[Service]
User=root
Type=simple
Environment="PATH=/anaconda3/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
Environment="SPARK_HOME=/spark-2.3.2-bin-hadoop2.7/"
Environment="SHELL=/bin/bash"
ExecStart=/anaconda3/bin/jupyterhub -f /etc/jupyter/jupyterhub_config.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

1
底层平台也很重要。在一些图形用户界面(GUIs)上,新终端将成为“登录” shell,而其他的则不会;因此,shell的启动文件应该做什么取决于这个问题。 - tripleee
取决于什么?我不确定你的意思。我将JupyterLab更新到最新版本,但没有效果。 - OneTwo
1
如果你在使用Linux,你的启动文件会做一件事情。如果你在使用Mac,它们会略有不同。而在Windows上,则放弃所有希望。你使用的是哪个操作系统?(如果你在这些文件中有重大的自定义,请也提一下。) - tripleee
它在Linux上,Ubuntu上,我已经更新了我的jupyterhub启动文件的帖子。 - OneTwo
1
看起来你需要告诉 Jupyter 你想要一个登录 shell ( bash --login -i ),否则要 source ~/.bashrc 。或者尝试更改 jupyter_notebook_config.py 文件以包括 c.NotebookApp.terminado_settings = {'shell_command': ['/bin/bash --login -i']} - Adam Katz
显示剩余2条评论
4个回答

3

根据这个GitHub问题,需要从profile中引用bashrc。

我已经确认了通过在/home/jovyan/.profile中添加以下内容可以实现:

bash
source /home/jovyan/.bashrc

3

你可以尝试创建一个文件

$HOME/.bash_login

从那里获取源代码.bashrc

source $HOME/.bashrc

并查看它是否符合您的要求。


很遗憾,没有成功 :( - OneTwo

1

当我在配置JupyterLab(类似于JupyterHub)作为Systemd服务时,我遇到了同样的问题。

第一解决方案

请先尝试第二个解决方案。)我们可以通过更改jupyter_notebook_config.py中的默认配置来解决该问题(正如其中一个评论和答案所说,但结论/解决方案正好相反。)

相关评论:enter image description here

文件jupyter_notebook_config.py位于$HOME/.jupyter/。如果不存在,可以通过运行以下命令生成:

jupyter lab --generate-config  

找到这个文件后,我们将其内容修改如下:

# This is for Jupyter Notebook
# c.NotebookApp.terminado_settings = {'shell_command': ['/bin/bash']}
# This is for JupyterLab/JupyterHub
c.ServerApp.terminado_settings = {'shell_command': ['/bin/bash']}

值得注意的是,在上面的评论和答案中提到的选项'--login','-i'可以防止终端加载.bashrc文件。 如果没有这些选项,shell看起来像这样(这是预期的):
(base) [ml@soc3 /]$ python --version
Python 3.9.5

使用这些选项时,Shell 的外观如下(未初始化 .bashrc):

bash-4.2$ python --version
Python 2.7.5
第二种解决方案

创建或编辑~/.bash_profile文件,以自动加载~/.bashrc

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

在阅读更多关于登录和交互式终端的内容之后,我发现Jupyter的终端的默认行为是登录和交互式的,并且如果存在~/.bash_profile文件(通常会加载~/.bashrc文件),它将会源化该文件。我的问题是,我为运行JupyterLab创建了一个新用户,但默认的~/.bash_profile并没有为此用户创建,因此~/.bashrc不会被源化。此外,我之前以root用户运行过JupyterLab,该用户拥有上述配置文件,因此JupyterLab终端可以正常工作。

我认为这更加合理。虽然第一个解决方案有效,但是为什么有效对我来说并不清楚。


1

让我猜一下发生了什么:

1. 配置问题

正如其中一条评论所说,更改 jupyter_notebook_config.py 以包括以下内容:

c.NotebookApp.terminado_settings = {'shell_command': ['/bin/bash', '--login', '-i']}

shell_command应该是由三个字符串组成的数组。请参阅https://github.com/jupyterlab/jupyterlab/issues/4042

2. 您的id或您的shell

在启动终端后立即检查这些内容。

$ whoami
$ echo $SHELL

为了确保您拥有正确的用户和正确的shell。如果您的用户不正确,它会期望在另一个用户的主目录中找到.bashrc文件。如果您的shell不正确,例如使用/bin/sh而不是/bin/bash(实际上这两者经常是硬链接),它将无法读取.bashrc文件。

如果是这样,请尝试查看Jupyter所看到的$SHELL环境变量是否正确。如果您没有指定shell_command,Jupyter应该使用它。

3. Jupyter可能会给您提供非交互式shell

如果您的bash确实没有读取您的文件,则可能会作为非交互式shell调用(我不知道如何)。要检查,您可以尝试运行以下命令:

$ ls
$ !!

第一个ls命令可以是任何命令。第二个!!是使用bash的历史扩展来调用最后执行的命令。如果不是交互式shell,则不会进行替换。

我不期望这种情况发生,也不知道如何修复。


我只有一个jupyterhub_config.py文件,没有jupyter_notebook_config.py文件,这样可以吗?还是两个都需要? - OneTwo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接