我正在创建一个Singularity图像,我希望有一个自定义的bash提示符,就像我可以通过设置~/.bash_profile
中的变量PS1
来设置bash提示符一样。
但是,不幸的是,Singularity做了一些事情来强制它自己的提示,看起来像这样:Singularity>
。这不是一个很有帮助的提示。
我尝试在定义文件中设置PS1,如下例所示:
# File prompt-test1.def
Bootstrap: shub
From: alpine:latest
%environment
export PS1="[my-container]\w\$ "
我构建并运行了该图像,但无济于事:
sudo singularity build prompt-test.sif prompt-test.def
singularity shell prompt-test.sif
# shows Singularity>
在shell中使用env
命令,我注意到设置了PROMPT_COMMAND
:
echo $PROMPT_COMMAND
# PS1="Singularity> "; unset PROMPT_COMMAND
所以我试着去改变
# File prompt-test2.def
Bootstrap: shub
From: alpine:latest
%environment
export PROMPT_COMMAND='PS1="[my-container]\w\$ "; unset PROMPT_COMMAND'
...但提示符保持不变!但是现在,容器中的PROMPT_COMMAND
看起来像
echo $PROMPT_COMMAND
# PS1="[my-container]\w\$ "; unset PROMPT_COMMAND; PROMPT_COMMAND="${PROMPT_COMMAND%%; PROMPT_COMMAND=*}";PS1="Singularity> "
编辑以替换为更好的信息:问题在于/.singularity.d/env
中的文件来源顺序。用户定义的环境变量在01-base.sh
中设置,但在99-base.sh
中有一行
PS1="Singularity> "
...它会覆盖我的提示!此外,由于/.singularity.d/actions/shell
或.../run
中的某些代码,使用PROMPT_COMMAND
的方法也受到阻碍。
解决方法是用户使用自己的.profile
。但如果用户的主目录绑定到容器内的主目录,则这不起作用,因为此时容器内外的.profile
是相同的。此外,我不希望用户干预只是为了更改提示。
如何获得提示?
2条答案
按热度按时间vojdkbi01#
默认情况下,由singularity运行的壳显式不加载任何profile或rc文件。提示符虽然很烦人,但它提醒您您处于映像中,而不是主机操作系统中。
如果无论如何都要覆盖它,则需要向
/.singularity.d/env
添加一个附加文件,该文件将在所有其他操作之后运行。例如,在
%post
之后添加-c /bin/bash
告诉奇点使用/bin/bash
而不是默认的/bin/sh
,这是之后多行cat
步骤所必需的。-c /path/to/shell
。vsnjm48y2#
我的解决方案是在singularity中使用
tmux
。它有标准的shell,提示符中有路径。