Bash

這個腳本(open-switch/opx-build/scripts/opx_run)如何傳遞變數?

  • June 30, 2020

像許多 bash 問題一樣,我 100% 確定有答案,但在Google上搜尋它們是具有挑戰性的。

我正在嘗試理解以下腳本

#!/bin/bash

# available options
export OPX_GIT_TAG="${OPX_GIT_TAG:-no}"

# package distribution
export OPX_RELEASE="${OPX_RELEASE:-unstable}"
# currently tracked release
export DIST="${DIST:-stretch}"
export ARCH="${ARCH:-amd64}"

export CUSTOM_SOURCES="${CUSTOM_SOURCES:-}"

# docker image name
IMAGE="opxhub/build"
# docker image tag
VERSION="${VERSION:-latest}"

interactive="-i"
if [ -t 1 ]; then
 # STDOUT is attached to TTY
 interactive="-it"
fi

read -d '' opx_docker_command <<- EOF
docker run
 --rm
 --name ${USER}_$(basename $PWD)_$$
 --privileged
 -e LOCAL_UID=$(id -u ${USER})
 -e LOCAL_GID=$(id -g ${USER})
 -v ${PWD}:/mnt
 -v $HOME/.gitconfig:/home/opx/.gitconfig
 -v /etc/localtime:/etc/localtime:ro
 -e ARCH
 -e DIST
 -e OPX_RELEASE
 -e OPX_GIT_TAG
 -e CUSTOM_SOURCES
 ${interactive}
 ${IMAGE}:${VERSION}
EOF

if [[ $# -gt 0 ]]; then
 # run command directly
 # not using bash because tar fails to complete
 # root cause unknown (see opx_rel_pkgasm.py:tar_in)
 $opx_docker_command sh -l -c "$*"
else
 # launch interactive shell
 # using bash here because tar does not fail in an interactive shell
 $opx_docker_command bash -l
fi

我對他們如何生成docker-run命令感到困惑——特別是關於ARCHDISTOPX_RELEASE等的部分。那些不應該被附上${}嗎?如果不是,這些變數是如何傳遞的?

如果你仔細看,你會發現這些變數的使用是在命令的一個-e選項中docker-run。此選項用於使環境變數可用於容器。

所以在這裡,腳本指定了應該傳遞給容器的環境變數的名稱,而不是值本身(正如你所說的那樣,它需要取消引用,如$ARCHor ${ARCH})。

您可以查看docker 文件以進一步閱讀。

引用自:https://unix.stackexchange.com/questions/595900