我有一个 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
- 让我们从简单的部分开始
当我做
sh testenv.sh
[...]
那是错误的。您已经编写了一个bash
脚本,甚至这样声明了它,所以用bash
not with来调用它sh
。
- 更多相同的
在文件中.myenv
你表明你有
#!/usr/bin/env sh
source ./testenv.sh
因此,您声明这是一个sh
脚本(不是bash
脚本),但随后您使用source
来拉testenv.sh
入sh
.但我们已经看到这testenv.sh
是一个bash
脚本,而不是一个sh
脚本。因此,除非您用来bash
运行此sh
脚本,否则它一有机会就会惨遭失败。
在您的本地系统上,您可能sh
有bash
.在您的云系统上,几乎可以肯定这sh
是不同 shell 的别名,例如dash
.这是完全正确的,系统正在尝试理解您的错误代码。
请停止使用source
,并停止混合sh
和bash
互换。它们是(或可以是)具有不同语法的不同 shell。