如何更改奇点容器中的默认提示

akr*_*ica 4 shell command-prompt singularity-container

我正在创建一个 Singularity 图像,并且想要一个自定义的 bash 提示符,就像我可以通过PS1在我的~/.bash_profile.

但是,不幸的是,Singularity 做了一些事情来强制执行自己的提示,如下所示:Singularity>。这不是一个很有帮助的提示。

我尝试在定义文件中设置 PS1,如下例所示:

# File prompt-test1.def
Bootstrap: shub
From: alpine:latest
%environment
export PS1="[my-container]\w\$ "
Run Code Online (Sandbox Code Playgroud)

我构建并运行了该图像,但无济于事:

sudo singularity build prompt-test.sif prompt-test.def
singularity shell prompt-test.sif
# shows Singularity>
Run Code Online (Sandbox Code Playgroud)

使用envshell 中的命令,我注意到已PROMPT_COMMAND设置:

echo $PROMPT_COMMAND
# PS1="Singularity> "; unset PROMPT_COMMAND
Run Code Online (Sandbox Code Playgroud)

...所以我试图改变这一点:

# File prompt-test2.def
Bootstrap: shub
From: alpine:latest
%environment
export PROMPT_COMMAND='PS1="[my-container]\w\$ "; unset PROMPT_COMMAND'
Run Code Online (Sandbox Code Playgroud)

...但提示保持不变!但现在,PROMPT_COMMAND容器内部看起来像

echo $PROMPT_COMMAND
# PS1="[my-container]\w\$ "; unset PROMPT_COMMAND; PROMPT_COMMAND="${PROMPT_COMMAND%%; PROMPT_COMMAND=*}";PS1="Singularity> "
Run Code Online (Sandbox Code Playgroud)

编辑以替换为更好的信息/.singularity.d/env:问题在于文件的来源顺序。用户定义的环境变量在 中设置01-base.sh,但其中99-base.sh有一行

PS1="Singularity> "
Run Code Online (Sandbox Code Playgroud)

...这会覆盖我的提示!PROMPT_COMMAND此外,由于/.singularity.d/actions/shellor中的某些代码,使用的方法受到阻碍.../run。

解决方法是用户使用自己的.profile. 但如果用户的主目录绑定到容器内的主目录,则不起作用,因为.profile容器的内部和外部是相同的。另外,我不希望用户干预只是为了更改提示。

我怎样才能得到我的提示?

tsn*_*lan 7

默认情况下,由奇异点运行的 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
Run Code Online (Sandbox Code Playgroud)

添加-c /bin/bashafter%post告诉使用奇异性/bin/bash而不是默认值/bin/sh,这是之后的多行cat步骤所必需的。

编辑:旧版本的奇异性在第一行使用 shebang 来指定备用 shell,但已更改为-c /path/to/shell.