xcrun simctl getenvは、シミュレータデバイスの環境変数を1つ取得するサブコマンドである。
参考: xcrun simctl boot/shutdownでiOSシミュレータデバイスを起動・終了する
基本的な使い方
getenv <device> <variable name>の形式で実行する。
$ xcrun simctl getenv "TIL Getenv iPhone" HOME
/Users/xxx/Library/Developer/CoreSimulator/Devices/<UDID>/data
$ xcrun simctl getenv "TIL Getenv iPhone" PATH
/Library/Developer/CoreSimulator/Volumes/.../RuntimeRoot/usr/bin:...
boot/rebootで設定したSIMCTL_CHILD_プレフィックス付きの環境変数も、プレフィックスを除いた名前で取得できる。
$ export SIMCTL_CHILD_TIL_GETENV_VAR="hello-getenv"
$ xcrun simctl reboot "TIL Getenv iPhone"
$ xcrun simctl getenv "TIL Getenv iPhone" TIL_GETENV_VAR
hello-getenv
存在しない変数名を指定してもエラーにならない
存在しない変数名を指定すると、その旨のメッセージが標準出力に表示されるが、終了コードは0のままでエラー扱いにならない。
$ xcrun simctl getenv "TIL Getenv iPhone" TIL_NONEXISTENT_VAR
'TIL_NONEXISTENT_VAR' not found
$ echo $?
0
変数の有無をスクリプトで判定したい場合は、終了コードではなく出力文字列を見る必要がある。
一部の変数はデバイスが起動していなくても取得できる
参考: xcrun simctl listでiOSシミュレータのデバイス・ランタイム一覧を絞り込む
で確認したappinfo・listappsなどの多くのサブコマンドは、対象デバイスが起動中でないとエラーになる。
getenvも基本的には同様だが、HOME・PATH・TMPDIRのような、デバイスの静的な設定から値を算出できる一部の変数に限っては、シャットダウン状態でも取得できる。
$ xcrun simctl shutdown "TIL Getenv iPhone"
$ xcrun simctl getenv "TIL Getenv iPhone" HOME
/Users/xxx/Library/Developer/CoreSimulator/Devices/<UDID>/data
一方、SIMCTL_CHILD_で設定したような独自の変数や、存在しない変数名を同じくシャットダウン状態で指定すると、明確なエラーになる。
$ xcrun simctl getenv "TIL Getenv iPhone" TIL_GETENV_VAR
An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
Unable to getenv(“TIL_GETENV_VAR”) while not booting or booted. Current state: Shutdown
USER・LANG・SHELLのように一見HOME・PATHと同格に見える変数でも、シャットダウン状態では同じエラーになる。
HOME・PATH・TMPDIRが例外的に取得できるのは「よく使われる変数だから」ではなく、これらの値がデバイスの静的な設定だけから計算でき、実行中プロセスの環境を必要としないためとみられる。
\第一線のプログラマーの行動原理を学べる!/
