改めてLinuxコマンドを理解する[環境変数について]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事はLinuxのPATHについてです。ここの理解がないと、シェル上でコマンドがどう実行されるかわからないという状態になります。

この記事では、環境変数について初学者でもわかるように解説していきます。

![bb1d71f9-ccd8-4d46-86c7-2390e1e48244_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/cdd610fd-5356-8f87-d7ed-9d815c55b61f.png)


## PATH（パス）について
まず、Linuxでは`/`（ルート）ディレクトリが最上位にあり、その下に根のようにディレクトリやファイルが置かれています。これは、Linuxで標準的に使える`ls`や`cat`コマンド等も例外ではなく、**どこかのディレクトリにコマンドの実行ファイルが置かれています**。

では`ls`などのコマンドはなぜ使えるのでしょうか？
シェルはコマンドが実行されると、そのコマンドの実行ファイルを探しにいきます。どういったところを探しに行くかというと、**PATHと呼ばれる環境変数に登録されたディレクトリを順番に確認**し、その中からそのコマンドの実行ファイルを見つけています。

たとえば`ls`の実行ファイルがどこにあるのか？というお話しですが、`which`コマンドで特定することができます。
```Bash:lsの場所を確認
which ls

# 実行結果
/bin/ls
```

Macの方は同じように上記のコマンドを叩くことができますので、ターミナル上で実行してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/f82dfaf2-7884-7d28-288e-56294679096e.png)

:::note info
どうやら、`ls`や`cat`コマンドは/binのディレクトリ以下にあるようです。
:::

まだPATHの話をしているわけではありません。
実際にシェルに登録してあるPATHを確認する時は、以下のコマンドで確認ができます。
```Bash:PATHの確認方法
echo $PATH
```

上記のコマンドの実行結果に、`/bin`があるはずです。
この`/bin`のディレクトリがPATHという環境変数に登録されているおかげで、`ls`や`cat`コマンドが使えるようになっています。

ただこのままでは横並びにディレクトリが並んでいて、とても見にくいと思います。
```Bash:PATHの表示結果の例
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/...
```
一応`:`で区切られているので、このままでもわかるのですが、少し表示結果を整えていきましょう。

## PATHの表示結果を整える
ホームディレクトリにある、.zshrcファイルを開いていただき、以下の記述を追加します。
```Bash:.zshrcにaliasを追加
alias path="echo $PATH | tr ':' '\n'"
```
上記のaliasを設定した後は、ファイルを保存して閉じてください。
```Bash:設定を反映させる
source ~/.zshrc
```

これで`path`とシェル上で叩くと、横並びだった表示が改行されるようになります。
```Bash:改行されて表示される
path
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/08ba0e02-b7e5-9702-651e-2e09237a9844.png)

:::note info
だいぶ見やすくなりましたね！😆
:::



## 環境変数ってなに？
さて、ここまでの説明で肝心の**環境変数**とは何か？を解説していなかったですね。
環境変数とは何かを理解していきましょう。

環境変数とは、***シェルや特定のプログラムが利用する設定情報を保持する変数***です。

:::note warn
PATHは環境変数の1つになります。
:::


様々な環境変数が登録されているので、まずは一覧で見ていきましょう。

```Bash:環境変数の一覧を確認
printenv
# or
env
```
これを叩くことによって、環境変数の一覧を表示することができます。

```Bash:一つ一つを確認するには
echo $SHELL
echo $PATH
echo $HOME
echo $USER
```

:::note warn
これらの変数は、システムやユーザーごとの設定情報を格納するのに使われています。
:::

もちろん、環境変数を自身で登録することも可能です。
#### 環境変数の登録と使用（一時的）
環境変数を登録する際は、`export`を使います。
```Bash:環境変数の登録方法
export MY_VAR="test"
echo $MY_VAR
# 実行結果
test
```

登録解除をしたい場合は以下のコマンドで可能です。
```Bash:unsetを使う
unset MY_VAR
```

:::note warn
この環境変数は一時的な登録になります。永続的に登録しておきたい場合はまた違う方法となりますのでご注意ください。
:::

#### 環境変数の登録と使用（永続的）
永続的に使いたい場合は、.zshrcに登録する必要があります。
```Bash:.zshrcに環境変数を登録
echo 'export MY_VAR="test"' >> ~/.zshrc
```

この場合、環境変数を削除するには、.zshrcから`export MY_VAR="test"`の記述を消す必要があります。

#### 変数の定義と使用方法の違い
通常のプログラムと、シェルでの変数定義は定義の方法は違いますが、やっていることは一緒です。
```Python:Pythonの変数
home = "test"
print(home)
```

```Bash:シェルの変数
home="test"
echo $name
```



## よくプログラムの内部で使われる.envファイルとの違い
さて、実際に開発をするようになると、.envというファイルに、プログラムで利用する環境変数を登録しておいて使う場面が出てきます。

まず結論からいいますと、.env は「プログラム用の環境変数」、シェルの export は 「シェル全体で有効な環境変数」 という違いになります。

よく使われるような.envの環境変数は以下になります。
- DBの認証情報
- 外部APIの認証情報
- ポート番号
- クラウドなどの外部サービスの認証情報

:::note info
シェル全体に影響を与えないためにも、プログラム内で使う環境変数は別にするのが一般的です。
:::

コードをGithubで管理している場合、.gitignoreと呼ばれるファイルに、.envを記述しておかないと、機密情報が漏れるのでお気をつけください。


## おわりに
今回は環境変数について解説しました。
シェルスクリプトなどを書き始めると、この辺りの変数はよく利用するようになります。ただ、初学者はシェル上で使われる変数なんだな〜くらいの認識で大丈夫です。

まとめ記事に戻るにはこちら👇

https://qiita.com/ikemura-ren/items/3e7b6ec1b0cd9b3928d6