シェルスクリプトでAndroid上のTermux環境を判定する
OS毎に異なる処理 Termuxはどうなるのか
dotfilesなどでOS、プラットフォームごとに一つのスクリプトを分岐させるのはよく見かける。大体はuname
の結果を見てそれぞれif文やswitch文で行うなど。
uname
を実行することで現在使用しているOSやカーネル情報、アーキテクチャ情報を出力できる。
$ uname
実行結果からOSとプラットフォームを判定して処理を分岐する処理はよく見るが、Termux(Android)の環境だけで分岐する処理を作りたかった。
Linux判定をネストして実現できそう
TermuxはLinuxのため、まずunameでLinuxの環境を判定する。Linuxの判定内でさらにTermuxの場合でネストできれば実現できそう。
Termuxでのunameはどうなるか
Termuxでuname
を使用した結果は以下の通り。
$ uname
Linux
これだけでは実行環境がLinux
としか判定できないため、追加で判別情報を取得できないか-all
オプションを付けて実行してみる。
結果は以下の通り。
$ uname
Linux localhost 4.9.112-perf+ #2 SMP PREEMPT Mon Oct 11 18:31:50 CST 2021 aarch64 Android
追加でアーキテクチャとプラットフォーム情報を取得できた。先頭から順番にカーネル名からOS名まで並んで出力されている。末尾にAndroid
と含まれているため、この部分を参照してTermuxを判定できそう。ただ--all
だと不要な情報まで含まれるのでOS情報だけを抽出できるのが望ましい。
そこで-o
オプションを使用してみる。
$ uname -o
Android
-o
オプションは実行しているOS名を表示する。--operating-system
の省略形。
ここではTermuxを実行している環境Android
が出力された。
分岐させるサンプル
それぞれの環境ごとに出力内容を変えて正しく分岐するか検証してみる。
検証環境はmacOS・Linux・Termuxの3つ。
以下のような順番に環境を判定し、標準出力を行うシェルスクリプトを作成した。
#!/usr/bin/env bash
if [ $(uname) == "Darwin" ]; then
# macOS
echo "Hello macOS!"
elif [ $(uname) == "Linux" ]; then
# Termux
if [ $(uname -o) == "Android" ]; then
echo "Hello Termux!"
else
# Linux
echo "Hello Linux!"
fi
else
echo "Unknown os"
fi
Termux標準のシェルであるbashで実行した結果がこちら。
$ bash os.sh
Hello Termux!
Linux環境の分岐の中でTermuxの処理へ分岐することを確認できた。