Если операторы не выполняются после вызова функции в bash - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть скрипт bash, который выглядит следующим образом:

#!/usr/bin/env bash
set -x

function run_container {
    CONTAINER_NAME=$(date +%s | sha256sum | base64 | head -c 16)
    echo "running: docker run -i --name $CONTAINER_NAME $REGISTRY/${1}"
    docker run -i --name $CONTAINER_NAME $REGISTRY"/"${1}
    echo "removing: container $CONTAINER_NAME from ${1}"
    docker container rm $CONTAINER_NAME
    echo "removing:  image $1"
    docker image rm ${REGISTRY}"/"${1}
    echo -e "\nDone with container ${1}\n\n\n"
    return 0
}


GCC_BUILD=${1}
GLIBC_BUILD=${2}
KERNEL_BUILD=${3}
POSTGRESQL_BUILD=${4}
PYTHON_BUILD=${5}
REINSTALL_PACKAGES=${6}
RUBY_BUILD=${7}
SEGMENTED_DOWNLOAD=${8}
UBUNTU_RSYNC=${9}


echo $GCC_BUILD
echo $GLIBC_BUILD
echo $KERNEL_BUILD
echo $POSTGRESQL_BUILD
echo $PYTHON_BUILD
echo $REINSTALL_PACKAGES
echo $RUBY_BUILD
echo $SEGMENTED_DOWNLOAD
echo $UBUNTU_RSYNC

REGISTRY="myregistry.com"


if [[ "$GCC_BUILD" == "true" ]]; then
    echo "Running GCC_BUILD"
    run_container "gcc-build"
fi

if [[ "$GLIBC_BUILD" == "true" ]]; then
    echo "Running GLIBC_BUILD"
    run_container "glibc-build"
fi

if [[ "$KERNEL_BUILD" == "true" ]]; then
    echo "Running KERNEL_BUILD"
    run_container "kernel-build"
fi

if [[ "$POSTGRESQL_BUILD" == "true" ]]; then
    echo "Running POSTGRESQL_BUILD"
    run_container "postgresql-build"
fi

if [[ "$PYTHON_BUILD" == "true" ]]; then
    echo "Running PYTHON_BUILD"
    run_container "python-build"
fi

if [[ "$REINSTALL_PACKAGES" == "true" ]]; then
    echo "Running REINSTALL_PACKAGES"
    run_container "reinstall-packages"
fi

if [[ "$RUBY_BUILD" == "true" ]]; then
    echo "Running RUBY_BUILD"
    run_container "ruby-build"
fi

if [[ "$SEGMENTED_DOWNLOAD" == "true" ]]; then
    echo "Running SEGMENTED_DOWNLOAD"
    run_container segmented-download
fi

if [[ "$UBUNTU_RSYNC" == "true" ]]; then
    echo "Running UBUNTU_RSYNC"
    run_container "ubuntu-rsync"
fi

echo "Finished build suite."

Как только оператор if совпадает, функция выполняется, но скрипт заканчивается.Так, например, если переменные GCC_BUILD и GLIBC_BUILD имеют значение true, сценарий будет выполнять действия в функции run_container для GCC_BUILD, но не для GLIBC_BUILD.

Если яудалите вызов run_container внутри операторов if и просто оставьте echo там, все работает как надо.

Есть ли что-то в функции, которая заставляет скрипт завершиться?

ОБНОВЛЕНИЕ :

Поскольку у меня есть set -x, вот что печатается для трассировки:

:18+GCC_BUILD=false
:19+GLIBC_BUILD=false
:20+KERNEL_BUILD=false
:21+POSTGRESQL_BUILD=false
:22+PYTHON_BUILD=true
:23+REINSTALL_PACKAGES=false
:24+RUBY_BUILD=true
:25+SEGMENTED_DOWNLOAD=false
:26+UBUNTU_RSYNC=false
:29+echo false
:30+echo false
:31+echo false
:32+echo false
:33+echo true
:34+echo false
:35+echo true
:36+echo false
:37+echo false
:39+ARTIFACTORY=myregistry
:42+[[ false == \t\r\u\e ]]
:47+[[ false == \t\r\u\e ]]
:52+[[ false == \t\r\u\e ]]
:57+[[ false == \t\r\u\e ]]
:62+[[ true == \t\r\u\e ]]
:63+echo 'Running PYTHON_BUILD'
Running PYTHON_BUILD
running: docker run -i --name OTQ0YzJjZTU4YWQy myregistry/image
:64+run_container python-build
::6+date +%s
::6+sha256sum
::6+base64
::6+head -c 16
:6+CONTAINER_NAME=OTQ0YzJjZTU4YWQy
:7+echo 'running: docker run -i --name OTQ0YzJjZTU4YWQy myregistry/image'
:8+docker run -i --name OTQ0YzJjZTU4YWQy myregistry/image

Done with container python-build

:9+echo 'removing: container OTQ0YzJjZTU4YWQy from python-build'
:10+docker container rm OTQ0YzJjZTU4YWQy
:11+echo 'removing:  image python-build'
:12+docker image rm myregistry/image
:13+echo -e '\nDone with container python-build\n\n\n'
:14+return 0

Я не могу опубликовать весь вывод, так как есть много, но это строки, которые печатаются из xtrace

1 Ответ

1 голос
/ 03 апреля 2019

Если ваш сценарий неожиданно прекращает выполнение после того, как программа, например ssh, ffmpeg или docker run -i, может прочитать stdin или изменить конфигурацию терминала, один шаг, который вы хотите запустить в отладке, - это перенаправитьстандартный ввод программы с /dev/null.

. Для этого (и устранить некоторые проблемы с именами, имеющими в процессе пробелы) измените:

docker run -i --name $CONTAINER_NAME $REGISTRY"/"${1}

на:

docker run -i --name "$CONTAINER_NAME" "$REGISTRY/$1" </dev/null

... или, если вам нужно более полно изолировать команду от терминала, вы можете (с некоторыми затратами на повышение эффективности) дать ей не-TTY stdout и stderr:

docker run -i --name "$CONTAINER_NAME" "$REGISTRY/$1" </dev/null > >(cat) 2>&1

...хотя я обычно удаляю -i, прежде чем идти так далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...