ubuntuにおける環境変数の設定

# 前提

この記事を書いている人は，技術記事を書くこと，および記事の内容についての知識が素人です．そのため，記事の内容は鵜呑みにせず引用した記事をたどったり，別の記事を読んだりするなど，ご自身で確認いただくようお願いします．~~要するに免責事項的なやつです~~

ところで，この記事ではubuntuにおける環境変数の設定とその関連事項について説明しますが，ubuntuに限らずLinux系なら同様にして環境変数の設定ができると思います．

前提はこのくらいで，環境変数について説明していきます．

# 環境変数

まず環境変数とは，OSにおける変数のようなものです．つまり，プログラムにおける変数と似たようなものです．

## 環境変数の確認，出力

現在設定されている環境変数を確認するには`env`や`printenv`とコマンドを打つことで確認できます．

```bash:bash
$ env
SHELL=/bin/bash
...(省略)

$ printenv
SHELL=/bin/bash
...(省略)
```

ただし，`env`の方では特定の変数について出力するということはできず，特定の変数について出力するなら`printenv`の方を使わないと出力されないみたいです．~~(まあgrep使えば検索できるけど)~~

```bash:bash
$ env SHELL
env: ‘SHELL’: No such file or directory
$ printenv SHELL
/bin/bash
```

それもそのはず．[このサイト](https://atmarkit.itmedia.co.jp/ait/articles/1801/18/news016.html)[^env]によると`env`は環境変数を**一時的に**指定してコマンドを実行するもののようです．というわけで`env`を簡単に使ってみましょう．


## envの実験

(2022/12/01追記：がっつりqiitaという文字を間違えてました...ごめんなさい．左上に書いてあるのにね．面白いのでそのまま残します．ｸｲｯﾀ)

以下のようなshellscriptを用意します．

```sh:envtest.sh
#!/bin/bash
echo $QUIITA
```

ちなみに`#!/bin/bash`の部分は，*Shebang*といいます．この記事では触れないので，気になった方は調べてみてください．気にならなかった方はお祈りやら念仏やらとして，ファイルでbashを使いたいときはこう書くものだと認識してください．

このファイルには実行権限を`chmod`で与えておいてください．~~知らない人はググってくれ~~

何も考えず実行した場合と`env`を使って出力した結果が以下の通りです．

```bash:bash
$ ./envtest.sh

$ env QUIITA='quiita' ./envtest.sh
quiita
```

このように環境変数を指定して実行することができました．ちなみにこの後`printenv QUIITA`としても何も出力されませんでした．確認してみてください．

環境変数についてはこのくらいで，続いてメインの題材である環境変数の設定について説明していきます．

# 環境変数の設定

環境変数を設定するには，bashで`環境変数名=値`とし，これを`export`するとできます．

```bash:bash
$ printenv QIITA
$ QUIITA=quiita
$ export QUIITA
$ printenv QUIITA
quiita
```

`export 環境変数名=値`としても問題なく設定できます

```bash:bash
$ printenv QUIITA
quiita
$ export QUIITA=quiiiiiita
$ printenv QUIITA
quiiiiiita
```

同じ環境変数名を改めて`export`すれば上書きをできるみたいです．

ただ，値で空白文字を含む場合，シングルクォートで囲む必要がある[^env_space]ようです．

```bash
$ printenv KANI
$ export KANI=ebi yadokari
$ printenv KANI
ebi
$ export KANI='ebi yadokari'
$ printenv KANI
ebi yadokari
$ export KANI="ebi yadokari tarabagani"
$ printenv KANI
ebi yadokari tarabagani
```

ダブルクォートでも問題なさそうです．

これで環境変数は設定できた，と言いたいところですが，再起動すると先ほど設定した環境変数は消えます．bash自体もプログラム(のはず)なので，プログラム中に記述された変数はプログラムが終了すれば消えます．

そのため，bashが起動される際に読み込むファイルに環境変数の設定を記述します．このあたりの細かい話は[こちらの記事](https://techracho.bpsinc.jp/hachi8833/2021_07_08/66396)[^env_profile]を参考にしていただいて(やや古い記事ですが)，結論だけいうと，`~/.profile`に環境変数の設定を記述する[^env_warning]といいと思います．しかし多くの記事では`~/.bash_profile`に書くことをおすすめしているみたいです．私の環境では`~/.bash_profile`を自分で作成する必要があったので`~/.profile`をおすすめしておきます．`~/.profile`は作成した覚えがないから多分あると思います．

```diff_shell: .profile (diff)
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

+ export QUIITA=quiita
+ export KANI='tarabagani ha yadokari'
```

これで改めて再起動をするか，bashで`source .profile`を打ち込む[^env_source]と環境変数が反映されるはずです．

お疲れ様でした．
以上がubuntuにおける環境変数の設定の説明となります．

[^env]: [【 env 】コマンド――環境変数を指定してコマンドを実行する](https://atmarkit.itmedia.co.jp/ait/articles/1801/18/news016.html)

[^env_space]: [Linuxで環境変数およびシェル変数を読み込み設定する方法](https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-linux-ja)

[^env_profile]: [いまさらですがLinuxで環境変数を設定したい](https://qiita.com/chihiro/items/bb687903ee284766e879)

[^env_warning]: `~/.bash_profile`の方じゃないの？と思われた方に向けてですが，`~/.bash_profile`に環境変数を記述すると`.bashrc`が読み込まれずコマンドラインの色が反映されなかったりします．そのため`~/.bash_profile`に`.bashrc`を読み込む処理を追加するのですが，私はこれにやや違和感を覚えるので`~/.profile`に書き込んだ方がいいかなと思います．また，記事内でも書きましたが，私の環境では`~/.bash_profile`が初期状態で存在しなかったんですよね．これも`~/.profile`に書いた方が良いと思った理由の一つです．

[^env_source]: [環境変数の設定(~/.bash_profile, ~/.bashrc)](https://www.wakuwakubank.com/posts/389-linux-bashrc/)