.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
交換を中止してください。それらは異なる構文を持つ別のシェルです(またはそうすることができます)。