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하고, 혼합 shbash교환을 중지하십시오. 그들은 다른 구문을 가진 다른 쉘입니다(또는 그럴 수 있습니다).

관련 정보