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容器的内部和外部是相同的。另外,我不希望用户干预只是为了更改提示。
我怎样才能得到我的提示?
默认情况下,由奇异点运行的 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.