Linux
shell 腳本在 Linux Centos7 中不工作,但在雲 shell 環境中工作
我有一個外殼
.myenv
,它正在呼叫另一個外殼testenv.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云 shell 中執行良好,顯然雲 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
- 讓我們從簡單的開始
當我做
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。