1

问题

我的奇点容器中的一个包中的一个配置脚本包含这个(对我来说)完全合理的 bash 来修剪/路径的尾随;

if [ "${MY_DIR_PATH: -1}" = "/" ]; then
    MY_DIR_PATH="${MY_DIR_PATH%?}"
fi

它在我的机器上本地运行良好,但是当从%post奇异容器的部分运行时,它会以Bad substitution. 出了什么问题,正确的解决方法是什么?

最小的工作示例

将下面的文本另存为badSubs.def然后尝试;sudo singularity build badSubs.sif badSubs.def.

BootStrap: docker
From: ubuntu:18.04

# what is done when the container is built
%post
    # make print colour #
    GREEN='\033[0;32m'
    NOCOLOUR='\033[0m'
    # start
    #echo "${GREEN}~~~ Give the user permission and control ~~~ ${NOCOLOUR}"
    #umask 000

    echo "${GREEN}~~~ this should work fine! ~~~ ${NOCOLOUR}"
    MYSCRIPT=$SINGULAITY_ROOTFS/confuzzel
    touch $MYSCRIPT
    chmod u+x $MYSCRIPT
    echo '#! /bin/bash' >> $MYSCRIPT
    echo 'PATHY="/what/a/path/"' >> $MYSCRIPT
    echo 'if [ "${PATHY: -1}" = "/" ]; then ' >> $MYSCRIPT
    echo '    echo yay!' >> $MYSCRIPT
    echo '    PATHY="${PATHY%?}"' >> $MYSCRIPT
    echo 'fi' >> $MYSCRIPT
    echo 'echo $PATHY' >> $MYSCRIPT
    cat $MYSCRIPT
    ./confuzzel

# metadata
%labels
    Author ClumsyCat
    Version v1.0

%help
    to build me
    > sudo singularity build badSubs.sif badSubs.def
    to run me do
    > singularity run badSubs.sif


4

2 回答 2

2

我不熟悉奇点,所以这是一个猜测,但我认为你的脚本是由 bash 以外的 shell 运行的(也许是破折号?)。${var: number}是对变量扩展语法的非标准扩展;bash 和其他一些 shell 支持它,其他(如 dash)不支持。

如果测试的唯一原因是找出变量是否以“/”结尾,如果它在那里你可以删除它,不要打扰。这是 POSIX 标准语法,如果变量以“/”结尾,则会从变量末尾删除“/”:

MY_DIR_PATH=${MY_DIR_PATH%/}

如果您确实需要测试,请改用它:

if [ "${MY_DIR_PATH%/}" != "${MY_DIR_PATH}" ]; then

解释:这会将带有“/”的变量从末尾删除与原始值进行比较;如果它们不同,那么最后一定有一个“/”。

于 2019-05-30T17:26:57.870 回答
-1

好的,回答我自己的问题,因为我发现了一些有用的东西;

if [ $(echo -n $MY_DIR_PATH | tail -c 1) = "/" ]; then
    MY_DIR_PATH="${MY_DIR_PATH%?}"
fi

灵感来自https://stackoverflow.com/a/32872687/7690011

如果有人想以一种解释为什么这样做的方式回答/添加到这个答案,我会接受这个答案。

于 2019-05-30T09:50:34.583 回答