【MAC】環境変数について調べてみた

# 背景
プログラミング言語を学ぶときによく見かける環境変数。分かりそうで実は分からないところが多かったので、気になったところを調べてみました。linuxコマンド、シェルスクリプトなど関連知識もまとめてみました。MACユーザーであるため、Windowsの環境変数については割愛します。

~~環境変数とは
MacやWindos、DosなどのOS上で設定値やデータを永続的に記憶しておき、どこからでも参照&利用できるようにするための箱（変数）のようなものです。英語だと「Environment variables」になります。~~

# MacのShell
Macには「bash」と「zsh」という２種類のシェル（shell)があり、このシェルを通じてカーネルというOSの中核となる部分にターミナルからのコマンドを解釈して伝える役割をしています。現在のMacのシェルは「zsh」であり、 Catalina以前のバージョンでは「bash」でした。環境変数の保存先にはこのshell名が入っています。

#主な環境変数について
主な環境変数は以下のようになります。echoコマンドを使って確認出来ます。ユーザー名は「hoge」とします。
$PATH：実行可能なファイルのパス（ディレクトリー）が保存されています。複数の場合（：）で区切って表示されます。

```cl
❯ echo $PATH
/usr/local/opt/node@14/bin:/usr/local/opt/mysql@5.6/bin:/Users/hoge/.rbenv/shims:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
```
$USER：ユーザーネームを表します。

```cl
❯ echo $USER
hoge
```

$HOME：デフォルトのユーザーのフォームディレクトリーのパスを表します。

```cl
❯ echo $HOME
/Users/hoge
```

$UID：ユーザーのユニックなIDを表します。

```cl
❯ echo $UID
501
```
$TERM：デフォルトの端末エミュレーター(terminal emulator)を表示してくれます。

```cl
❯ echo $TERM
xterm-256color
```

$SHELL：ユーザーが使用しているシェルのパスを表します。

```cl
❯ echo $SHELL
/bin/zsh
```

その他に指定されている全ての環境変数を表示するには「env」コマンドを使います。

```cl
❯ env
TERM_SESSION_ID=xxxxxxxxxxxxxxxxxxxxxx
SSH_AUTH_SOCK=xxxxxxxxxxxxxxxxxx
COLORFGBG=xxxxxxxxxxx
ITERM_PROFILE=xxxxxxxxxx
XPC_FLAGS=xxxxxxxxxx
LANG=ja_JP.UTF-8
PWD=/Users/hoge
SHELL=xxxxxxxxxxxxxxxx
TERM_PROGRAM_VERSION=xxxxxx
　　　　（中略）
```

# MacOS上の環境変数を操作できるファイル(ログインシェル)はどこにある？
結論から言うとホームディレクトリーにあります。ホームディレクトリーとは「/Users/ユーザ名」となっているところであり、コマンドラインでは「〜」と表示されます。ファイル名は「bash」ジェルの場合は「.bash_profile」、「zsh」シェルでは「.zshrc」です。「.」は隠しファイルを意味します。ホームディレクトリーに移動しコマンドラインで「ls -a」を打つと見れます。Finderで確認するには「shift + command + .」キーを同時に押すと隠しファイルを表示してくれます。

```cl
❯ ls -a
.                                      .zsh
..                                     .zsh_history
.CFUserTextEncoding                    .zsh_sessions
.DS_Store                              .zshrc
.Trash                                 .zshrc.pre-oh-my-zsh
.atom                                  .zshrc_history
                    (中略）
```  

# ~~環境変数ファイル~~ログインシェルを編集するには
テキストエディターを使います。vscode、atom、sublime textなどのエディターでも構いませんが、通常vimテキストエディターを利用します。vimエディターを使う理由はいろいろあると思いますが、私が思うにはCUI上で起動するのでAMAZONのEC2仮想サーバーにsshキーで接続した場合など、GUIのエディターを利用出来ない環境であったりした場合に活躍するので、vimエディターを利用するのではないかと思います。（また、起動するのに時間が掛からなかったり、とてもシンプルで使いやすいのでよく使われているのだとか）

```cl
#bashシェルの場合
vim ~/.bash_profile
```

```cl
#zshシェルの場合
vim ~/.zshrc
```
「~/」は「~」でホームディレクトリー（/Users/ユーザ名)に「/」を付けただけで、/Users/ユーザ名/を意味します。

#独自の環境変数を設定する方法
vimで開いた「.zshrc」ファイルで「export」コマンドで設定出来ます。正確には設定ではなく、保存した環境変数をOS上で利用できるように輸出（export)・共有します。書き方としては「export 変数名=値」。

```cl
export AUTH_USER='hoge'
export AMAZON_PASS_WORD='XXXX'
```

変数名は何でもありですが、覚えやすい変数名にした方がいいと思います。また、既存の環境変数＄PATHに独自の実行ファイルのパス（ディレクトリー）を指定することも可能です。指定方法は「export PATH="新たに指定したい実行ファイルのパス:＄PATH"」で、PATHと言う環境変数名に"新たに指定したい実行ファイルのパス"を書き、":＄PATH"と繋げます。こうすることで最初から定義されていたPATHの値に新たに追加することが出来ます。

```cl
#mysqlのパスを指定した例
export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"
```

#その他
evalコマンドを「.zshrc」や「.bash_profile」ファイルに記述することで、ターミナルを起動するたびに特定のコマンドを実行するようにすることが可能になります。「eval」コマンドは、指定した文字列を解釈し連結した後にシェル上で実行されます。複数のコマンドを実行するにはコマンドの間に「;」を入れます。試しに「.zshrc」ファイルをvimエディターで開いて次のように記述します。

```cl
eval echo $PATH;echo $USER
export BASIC_AUTH_USER="xxxxxxxxxxx"
export BASIC_AUTH_PASSWORD="xxxxxxxxxx"
export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxx"
     (中略）
```
ターミナルを閉じて、再起動すると、

```cl
Last login: Fri Apr 16 21:29:48 on ttys008
/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands
hoge

~
❯ 
```
環境変数＄PATHと＄USERの値がechoコマンドによって実行され表示されます。
Railsでは「rbenv init」コマンドで毎回初期化する必要がありますが、これを環境変数を管理する「.zshrc」ファイルに書いておくことによって手で打つ手間が省けます。

```cl
eval "$(rbenv init -)"
```

# 参考サイト&記事
https://wa3.i-3-i.info/word11027.html
https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html
https://en.wikipedia.org/wiki/Environment_variable
https://yuu.1000quu.com/understanding_the_env
https://www.guru99.com/linux-environment-variables.html
https://www.atmarkit.co.jp/ait/articles/1712/22/news019.html
https://eng-entrance.com/unix_linux
https://eng-entrance.com/linux-shellscript-what
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1420093584
https://www.webzoit.net/hp/it/internet/homepage/env/cs/server/os/type/unix/linux/shell/kind/
https://gabekore.org/mac-ruby-rails-rbenv