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シミュレータのデバイス・ランタイム一覧を絞り込む で確認したappinfolistappsなどの多くのサブコマンドは、対象デバイスが起動中でないとエラーになる。 getenvも基本的には同様だが、HOMEPATHTMPDIRのような、デバイスの静的な設定から値を算出できる一部の変数に限っては、シャットダウン状態でも取得できる。

$ 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

USERLANGSHELLのように一見HOMEPATHと同格に見える変数でも、シャットダウン状態では同じエラーになる。 HOMEPATHTMPDIRが例外的に取得できるのは「よく使われる変数だから」ではなく、これらの値がデバイスの静的な設定だけから計算でき、実行中プロセスの環境を必要としないためとみられる。