Linux Centos7ではシェルスクリプトは機能しませんが、Cloud Shell環境では機能します。

Linux Centos7ではシェルスクリプトは機能しませんが、Cloud 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 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 および Cloud 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で呼び出してくださいsh

  1. 同じもの

文書では、.myenvあなたは

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

だからあなたはこれがshスクリプト(bashスクリプトではない)であると言い、それを引き出すために使用します。sourceしかし、私たちはこれがスクリプトではなくスクリプトであることを見ました。したがって、このスクリプトを実行するためにそれを使用しないと、チャンスがあるたびに悲惨に失敗します。testenv.shshtestenv.shbashshbashsh

ローカルシステムにはshありますbash。クラウドシステムでは、shほぼ確実に他のシェルのエイリアスですdash。たとえば、システムはエラーコードを理解しようとします。

使用を中止sourceし、混合shおよびbash交換を中止してください。それらは異なる構文を持つ別のシェルです(またはそうすることができます)。

関連情報