Closed4

シェルスクリプトで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つ。
以下のような順番に環境を判定し、標準出力を行うシェルスクリプトを作成した。

os.sh
#!/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の処理へ分岐することを確認できた。

このスクラップは2022/07/04にクローズされました