我正在创建一个Singularity映像,我想要一个自定义的bash提示,就像我可以通过在~/.bash_profile
中设置变量PS1
来将bash提示设置为普通用户一样。
但是,不幸的是,奇点做了一些事情来强制执行它自己的提示,如下所示: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
是相同的。此外,我不希望用户干预只是为了更改提示。
我怎样才能得到提示?
默认情况下,奇点运行的shell显式不加载任何概要文件或rc文件。提示虽然很烦人,但它是为了提醒你,你在一个映像中,而不是主机操作系统中。
如果您无论如何都想覆盖它,您需要向/.singularity.d/env
添加一个额外的文件,该文件将在其他所有文件之后运行。例如
Bootstrap: docker
From: alpine:latest
%post -c /bin/bash
CUSTOM_ENV=/.singularity.d/env/99-zz_custom_env.sh
cat >$CUSTOM_ENV <<EOF
#!/bin/bash
PS1="[my_container]w $"
EOF
chmod 755 $CUSTOM_ENV
在%post
之后添加-c /bin/bash
告诉奇点使用/bin/bash
而不是默认的/bin/sh
,这对于之后的多行cat
步骤是必要的。
EDIT:早期版本的奇点在第一行使用shebang来指定备用外壳,但已更改为-c /path/to/shell
。
对我有效的解决方案是在奇点内使用tmux
。它有一个标准shell,提示中有路径。