Linux

shell 腳本在 Linux Centos7 中不工作,但在雲 shell 環境中工作

  • September 21, 2020

我有一個外殼.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
  1. 讓我們從簡單的開始

當我做sh testenv.sh

$$ … $$

那是錯誤的。您已經編寫了一個bash腳本,甚至將其聲明為這樣,因此請使用bashnot with來呼叫它sh

  1. 更多相同

在文件.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,並停止混合shbash互換。它們是(或可以是)具有不同語法的不同 shell。

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