当ssh进入虚拟机时,环境变量未通过脚本正确设置

时间:2015-04-23 23:19:46

标签: linux bash ssh

所以我目前正在开发LLVM编译器项目,并且我在MacBook Air上运行VirtualBox中的Ubuntu 14.04.2 LTS。

我收到了一个bash脚本,用于为项目设置所需的环境变量。如果我从VM中的终端获取脚本,则脚本可以正常运行。但是,我启用了端口转发,我正在使用从Mac的默认终端ssh进入VM。但是,当我进入VM然后尝试运行脚本并设置环境变量时,它们没有正确设置。

这是脚本 -

BASESCRIPT=$(readlink -f "$0")
BASE=$(dirname "$BASESCRIPT")
PROJ="cse231"

if [ -n "${VTENV}" ]; then
    if [ "${BASE}" = "${VTENV}" -a "${PROJ}" = "${VTENV_NAME}" ]; then
        echo "${VTENV_NAME} Virtual Environment is already active."
    else
        echo "There is already ${VTENV_NAME} Virtual Environment activated."
        echo "(at ${VTENV})"
        echo "Deactivate it first (using command 'deactivate_vtenv'), to activate"
        echo "test environment."
    fi
    return 1
fi

export VTENV="${BASE}"
export VTENV_NAME="${PROJ}"
export CSE231ROOT="${VTENV}"
export LLVMBIN="${VTENV}/llvm/build/Release+Asserts/bin"
export LLVMLIB="${VTENV}/llvm/build/Release+Asserts/lib"
export BENCHMARKS="${VTENV}/extra/benchmarks"
export INSTRUMENTATION="${VTENV}/extra/instrumentation"
export OUTPUTLOGS="${VTENV}/logs"

echo "Activating ${VTENV_NAME} Virtual Environment (at ${VTENV})."
echo ""
echo "To exit from this virtual environment, enter command 'deactivate_vtenv'."

export "VTENV_PATH_BACKUP"="${PATH}"
export "VTENV_PS1_BACKUP"="${PS1}"

deactivate_vtenv() {
    echo "Deactivating ${VTENV_NAME} Virtual Environment (at ${VTENV})."
    echo "Restoring previous environment settings."

    export "PATH"="${VTENV_PATH_BACKUP}"
    unset -v "VTENV_PATH_BACKUP"
    export "PS1"="${VTENV_PS1_BACKUP}"
    unset -v "VTENV_PS1_BACKUP"

    unset -v VTENV
    unset -v VTENV_NAME
    unset -v CSE231ROOT
    unset -v LLVMBIN
    unset -v LLVMLIB
    unset -v BENCHMARKS
    unset -v INSTRUMENTATION
    unset -v OUTPUTLOGS
    unset -f deactivate_vtenv

    if [ -n "$BASH" -o -n "$ZSH_VERSION" ]; then
        hash -r
    fi
}

export PATH="${VTENV}/llvm/build/Release+Asserts/bin:${PATH}"

export PS1="[${VTENV_NAME}]${PS1}"

if [ -n "$BASH" -o -n "$ZSH_VERSION" ]; then
    hash -r
fi

我遇到的问题是环境变量$ BASE应设置为 " / home / user / cse231-proj",当我从VM中获取脚本时。但是当我从我的Mac终端ssh进入后,我将环境简单地设置为"。"并且从中扩展了所有相应的环境变量,使用环境变量捏造我想要运行的任何其他命令。

这里发生了什么以及脚本为什么无法读取正确的绝对路径?我该怎么办呢?任何帮助,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

当您通过SSH登录时,当您获取脚本(或类似内容)时,$ 0为-bash,因为它是登录shell。 readlink将其视为另一个命令行参数并失败,将BASESCRIPT设置为示例中的空字符串,这意味着dirname返回。你看。

不要当前shell中的脚本,而是运行。然后$ 0将是脚本的名称,readlink -f $0将返回其完整的规范路径,然后dirname将发出脚本的路径,就像它应该的那样。