Envaderを利用して、環境変数とは何なのか？を学ぶ。

30代後半、未経験からIT業界のエンジニア転職へ挑戦している、kobakichiです。

今回は環境変数について、`Envader`を利用して学習したので、自分の中で理解した事の振り返りになります。

良く**環境変数**は聞く事がありましたが、きちんと意味を理解していなかったので、今回記事にまとめながらより理解を深めていきます。

## 使用した環境

オンラインで環境構築が不要、すぐにLinux環境が使えて実践する事ができるオンライン学習サービス`Envader`を利用して学習を進めました。

`Envader`について気になる方は、下記にリンクを貼っておきますので参考までにどうぞ。

[Envader](https://envader.plus/)

[コース一覧](https://envader.plus/course)

[今回使用したシナリオ](https://envader.plus/course/1/scenario/1015)

## 環境変数(Environment Variable)とは

まず環境変数とは何なのか？について。

- ~~OSが動いているときに使える変数~~
- ~~全てのプログラムから参照できる変数~~
- ~~OSが提供するデータ共有機能の一つ~~
- ~~悪用されたくない値を入れておける、比較的安全に使用できる変数~~

~~このような感じでしょうか？~~

>簡単に言うと環境変数とは、プログラムの挙動を調整するためのパラメータの一種であって、プロセス毎に保持・管理するものです。

@angel_p_57さんよりご指摘いただきました。

私自身ふわっとした理解で環境変数を表現してしまいましたが、超概要的に表現すると環境変数とは**プログラムの挙動を調整するためのパラメータの一種で、プロセス毎に保持・管理するもの**なんだそうです。

[環境変数ってなに? ( Linux )](https://qiita.com/angel_p_57/items/480e3fd4552e52199835#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)

まだまだ参考記事の内容をきちんと理解できているわけではないのですが、かなり詳細に解説されていますので、ぜひご一読を。。

ご指摘ありがとうございました。

## 環境変数の使われ方

環境変数の存在は分かりました。
では、環境変数は実際にはどんな使われ方をしているのか？を考えてみます。

- パスを通す場面
- システムやアプリケーションのコードには直接書くことを推奨されない変数を使いたい場面
- 頻繁に利用する値を変数に保存しておきたいとき
- Linuxで使用する言語(LANG)を変更したいとき

ここで注目したいのが、`システムやアプリケーションのコードには直接書くことを推奨されない変数を使いたい場面`です。

セキュリティに関しても環境変数が一役買ってくれているんですね！

以下Envaderより引用

>特にシステムやアプリケーションのコードには直接書くことが推奨されない変数を、環境変数を用いて設定することはセキュアなものを作る際に欠かせないことです。例えば、GitHub上で世界中に自分の書いたコードを公開したい時、そのコードの中に直接データベースのユーザ名やパスワードを書いてしまっては、それが悪用されてしまう危険性があります。こういった、他人に知られてしまうと良くない変数は直接コード上で値を書かずに、環境変数を作成して参照するようにしましょう。

なるほど。
ユーザ名やパスワードを環境変数に入れておく事で、他人に知られずに大切な情報を守る事ができるという事何ですね〜。
今まで環境変数はあまり触れた事がなく、意識した事がなかったのですが、今後アプリケーションを作成するときには意識して環境変数を設定するようにしようと思います。

## 環境変数を表示させてみる

では、実際にどんな環境変数があるのかを表示してみましょう。

設定してある環境変数の一覧を表示するには`env`コマンドを使います。

```bash
envader@172-19-1-2:~$ env

#以下一部抜粋

LANG=ja_JP.UTF-8
VISIBLE=now
USER=envader
PWD=/home/envader
HOME=/home/envader
```

ちなみに、`export`コマンドを引数なしで実行しても環境変数の一覧が表示できます。

```bash
envader@172-19-1-2:~$ export
declare -x HOME="/home/envader"
declare -x LANG="ja_JP.UTF-8"
declare -x LOGNAME="envader"
```


wikipediaさんに環境変数についての例が載っていたので、共有させていただきます。

> 環境変数の例
>EDITOR: エディタのコマンド名を指定する。エディタを起動するプログラム（mail、lessなど）で参照される。
>HOME: ホームディレクトリを指定する。cdコマンドで引数を指定しない場合、このディレクトリに移動する。例: /home/$USER
>LANG: ロケールを指定する。日本語ロケールの場合はjaまたはja_JPなどを指定する。setlocale()関数の呼び出しにより有効となる。
>LESSCHARSET: lessの入力・出力文字コードを指定する。
>PATH: コマンド検索パスをコロンで区切って指定する。シェルが参照する。
>SHELL: 現在のシェルの起動パスが設定される。シェルを確認するのに利用できる。例: /bin/sh

[wikipedia](https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)

環境変数の名前に応じて、それぞれ意味があったんですね。
この変数名にはこの機能を割り当てる。みたいな感じですね。

## 環境変数を新しく作成する

何か新しく環境変数を作成したい場合には、`export`コマンドを使って作成します。

```bash
export 環境変数名＝値
```

ちなみに環境変数名は大文字でも小文字でもOK大丈夫です。
ただ、大文字のアルファベットを利用するのが通例となっているためみんな大文字で記述されているようです。

## 環境変数を削除する

環境変数を削除するには`unset`コマンドを使用します。

```bash
unset 削除したい環境変数名
```

これで環境変数の削除ができます。

実際に環境変数の作成と削除をやってみます。

```bash
#exportコマンドで環境変数NAMEを作成！
envader@172-19-1-2:~$ export NAME=kobakichi

#環境変数が設定できたか確認！
envader@172-19-1-2:~$ echo $NAME
kobakichi
#できた！

#unsetコマンドで環境変数NAMEを削除！
envader@172-19-1-2:~$ unset NAME

#再度確認してみる！
envader@172-19-1-2:~$ echo $NAME

#上が空欄なので削除できている！
envader@172-19-1-2:~$
```

### 注意点
環境変数を設定する際は、`export`コマンドを使用して設定しますが、これだけだと一時的に設定は反映されますが、再度ターミナルを起動したときには設定がリセットされてしまいます。

これを防ぐには、設定ファイルに設定を書き込み、ターミナルを起動した時点で読み込まれるようにしなければなりませんので、注意しましょう。

具体例を出すと、`.bashrc`または`.zshrc`に書き込みます。

```bash:.bashrc
export NAME=kobakichi
```

そして、もう一つ忘れてはいけないのが、`.bashrc`を書き込んだ後の設定ファイルの再読み込みです。
これを忘れてしまうと、せっかく内容を記述して保存してもすぐに設定が反映されません。

```bash
source ~/.bashrc
```

これで設定が即座に反映され、設定した環境変数を利用する事ができ、ターミナルを立ち上げるごとに設定が読み込まれるようになります。

## まとめ

- 環境変数とはプログラムの挙動を調整するためのパラメータの一種であって、プロセス毎に保持・管理するもの。
- 環境変数に値を設定しておくことで、他のプロセスでも使い回す事ができて便利。
- 悪用されたくない値を入れておける、セキュリティにも一役買ってくれる存在。

今後エンジニアとして活動していく中で、少しづつ深く理解できるようにしていきます。

最後まで読んでいただきありがとうございました。

## 参考にさせていただいた記事一覧

[環境変数](https://wiki.archlinux.jp/index.php/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#.E5.A4.89.E6.95.B0.E3.81.AE.E5.AE.9A.E7.BE.A9)

[wikipedia](https://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)

[LinuC](https://linuc.org/study/knowledge/348/)

[IT用語辞典](https://e-words.jp/w/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0.html)

[webzoit](https://www.webzoit.net/hp/it/internet/homepage/env/cs/server/os/type/unix/linux/shell/kind/sh_bash/environment/)

[【 declare 】コマンド――変数を宣言する、変数などの内容を表示する](https://atmarkit.itmedia.co.jp/ait/articles/1905/30/news017.html)