shell脚本在Linux Centos7中不起作用,但在云shell环境中起作用

shell脚本在Linux Centos7中不起作用,但在云shell环境中起作用

我有一个 shell.myenv正在调用另一个 shelltestenv.sh

  • .myenv
    #!/usr/bin/env sh
    source ./testenv.sh
    
  • testenv.sh
    #!/usr/bin/env bash
    if [[ "$OSTYPE" == "linux-gnu" ]]; then
      echo 'Linux detected'
      python_binaries_path='/usr/local/bin:/usr/bin:/bin'
    elif [[ "$OSTYPE" == "darwin"* ]]; then
      echo 'MacOS detected'
      python_binaries_path='/opt/local/bin:/usr/local/bin:/usr/bin:/bin'
    else
      echo "Cannot determine OS type: ${OSTYPE}"
      exit 1
    fi
    python_binaries='python3.7 python3 python'
    python_path=$(PATH=${python_binaries_path} which ${python_binaries} | head -n 1) || true
    echo "python_path=$python_path"
    python_major_version=$(${python_path} -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major)')
    
    echo "python_major_version=$python_major_version"
    echo "python_binaries_path=$python_binaries_path"
    

当我这样做时source .myenv,它无法检测到python_major_version

Linux detected
python_path=alias python='python3.7'
-bash: alias: -c: not found
-bash: alias: `import platform; major, minor, patch ': invalid alias name
python_major_version=
python_binaries_path=/usr/local/bin:/usr/bin:/bin

当我这样做时sh testenv.sh,它能够检测到python_major_version

Linux detected
python_path=/usr/local/bin/python3.7
python_major_version=3
python_binaries_path=/usr/local/bin:/usr/bin:/bin

下面一行正在创建问题,我正在 Centos7 上运行这些脚本。

python_major_version=$(${python_path} -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major)')

但是这个脚本在 Google cloud shell 中运行良好,显然因为 cloud shell 在 Debian 环境中运行

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

我正在寻找解决方案或更改脚本,以便它可以在 Linux 和云 shell 环境中工作。

我觉得别名引起了一些问题。下面是我的.bashrc文件

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
alias python=python3.7
alias pip=pip3.7

答案1

  1. 让我们从简单的部分开始

当我做sh testenv.sh[...]

那是错误的。您已经编写了一个bash脚本,甚至这样声明了它,所以用bashnot with来调用它sh

  1. 更多相同的

在文件中.myenv你表明你有

#!/usr/bin/env sh
source ./testenv.sh

因此,您声明这是一个sh脚本(不是bash脚本),但随后您使用source来拉testenv.shsh.但我们已经看到这testenv.sh是一个bash脚本,而不是一个sh脚本。因此,除非您用来bash运行此sh脚本,否则它一有机会就会惨遭失败。

在您的本地系统上,您可能shbash.在您的云系统上,几乎可以肯定这sh是不同 shell 的别名,例如dash.这是完全正确的,系统正在尝试理解您的错误代码。

请停止使用source,并停止混合shbash互换。它们是(或可以是)具有不同语法的不同 shell。

相关内容