Нелогичная «плохая замена» в единственном числе - PullRequest
1 голос
/ 30 мая 2019

Задача

Один из сценариев конфигурации из пакета в моем контейнере сингулярности содержит этот вполне разумный (для меня) бит 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


Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Я не знаком с сингулярностью, так что это предположение, но я думаю, что ваш скрипт запускается из оболочки, отличной от bash (может быть, dash?).${var: number} - нестандартное расширение синтаксиса расширения переменной;bash и несколько других оболочек поддерживают его, другие (например, dash) - нет.

Если единственной причиной теста является выяснение, заканчивается ли переменная символом "/", чтобы вы могли удалить ее, если она есть, не беспокойтесь.Это стандартный синтаксис POSIX, который удалит «/» из конца переменной , если переменная оканчивается на «/»:

MY_DIR_PATH=${MY_DIR_PATH%/}

Если вам действительно нужноtest, используйте это вместо:

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

Объяснение: При этом переменная с "/" удаляется с конца до исходного значения;если они разные, в конце должно быть "/".

0 голосов
/ 30 мая 2019

ОК, отвечая на мой собственный вопрос, потому что я нашел что-то, что работает;

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

Вдохновленный https://stackoverflow.com/a/32872687/7690011

Если кто-то захочет ответить / добавить к этому ответу таким образом, чтобы объяснить, почему это работает, я бы принял этот ответ.

...