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

jmp7cifd  于 2023-05-01  发布在  Shell
关注(0)|答案(2)|浏览(129)

我正在创建一个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是相同的。此外,我不希望用户干预只是为了更改提示。
如何获得提示?

vojdkbi0

vojdkbi01#

默认情况下,由singularity运行的壳显式不加载任何profile或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步骤所必需的。

  • 编辑:* 旧版本的奇点在第一行使用shebang来指定备用shell,但已经改为-c /path/to/shell
vsnjm48y

vsnjm48y2#

我的解决方案是在singularity中使用tmux。它有标准的shell,提示符中有路径。

相关问题