.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
- 쉬운 부분부터 시작해보자
내가 할 때
sh testenv.sh
[…]
그건 틀렸어요. 스크립트 를 작성 bash
하고 이렇게 선언까지 했으니 bash
not 으로 호출하세요 sh
.
- 같은 것 더
문서에서 .myenv
귀하는 귀하가
#!/usr/bin/env sh
source ./testenv.sh
그래서 당신은 이것이 sh
스크립트( bash
스크립트가 아님)라고 말하고 를 끌어오기 위해 사용합니다 . source
그러나 우리는 이것이 스크립트 가 아니라 스크립트 라는 것을 보았습니다 . 따라서 이 스크립트를 실행 하는 데 이를 사용하지 않으면 기회가 있을 때마다 비참하게 실패하게 됩니다.testenv.sh
sh
testenv.sh
bash
sh
bash
sh
로컬 시스템에서는 sh
가 있을 수 있습니다 bash
. 클라우드 시스템에서는 sh
거의 확실하게 다른 셸의 별칭입니다 dash
. 예를 들어 시스템이 오류 코드를 이해하려고 합니다.
사용을 중지 source
하고, 혼합 sh
및 bash
교환을 중지하십시오. 그들은 다른 구문을 가진 다른 쉘입니다(또는 그럴 수 있습니다).