Linuxの構造を理解すれば、環境PATHの通し方が理解できる


# まえがき
どのプログラミング言語も、言語の中のライブラリでも、<B>インストールしてから使うまでが実はしんどい</B>ということに共感してくれる方も少なくないと信じています。

ターミナルで「jupyter notebook」や「python」コマンドを使うには、環境変数であるPATHにこれらのコマンドを通す必要があります。
しかし、自分はいつもサイトなどで調べて闇雲にコピペして、通れば「っしゃぁ！」って感じで早速コードの学習とかしてきました。

初心者や初学者であればいちいち環境変数の通し方とか学ぶより、実践的なハンズオンをすればいいと思うので、わざわざ知らなくてもいいとは思います。

しかし、何事もちゃんと意味があって動作するのがコンピュータやインターネットであるため、
「どういうことをしているのか？」を知ることは無駄にはならないと思っています。

今回は自分の中である種の原点を探るような感覚だった「PATH」を通す過程の意味するところ、を書いていこうと思います。

※ちなみに今回はlinuxを対象としているため、windowsなどはその限りではない、ということは御了承下さい。。。

# そもそもLinuxのディレクトリ構造を理解しているだろうか？
自分はシステム関係などをまっったく学習せずpythonなどを扱ってきたり、for文・if文などを学習してきた人です。

なので、時たま出てくるディレクトリの「/var/~」やら「/opt/~」などに気にせず、
「そういうディレクトリがこのPCあるんだ〜」程度の認識で進めてました。
（別に悪いとは思いませんが笑）

Linuxの学習（LinuCとか）をしていると、実はそれぞれのディレクトリには目的があって構成されていることを知りました。
（仮想環境ではLV（論理ボリューム）などでひとまとめにして自分でパーティションを作成したりはできる）


代表的なものをざっとまず紹介します（後ほど出てくるものも出てこないものもあるので、一旦読み飛ばしてもらってもOKです。）

## / (root)
もっとも最上の階層にあるディレクトリ。
全てのディレクトリはここから始まる。

注意すべきは、rootユーザーと自分のホームディレクトリは違う、という点です。
ちょっと見てみましょう
（仮想環境でubuntuを起動しています。windowsユーザーなどはvirtual boxやdockerのコンテナ上でお試しいただければ）

### 一般ユーザ
![スクリーンショット 2021-12-01 14.03.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865635/0d98099d-26fe-5ff3-4d37-6ade248a41ca.png)
### root 
![スクリーンショット 2021-12-01 14.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865635/238aaa54-1022-6feb-10f5-bed7e6d92c9b.png)

ちゃんと違いますね。
もし、例えばrootユーザで自分（画像で言えば「ubuntu」という名前のユーザ）のホームディレクトリを見たい時は以下
`cd ~ユーザ名; pwd`
とかでいけます

## /bin
一般ユーザ用のコマンドを格納しているディレクトリです。
ずっとbinてなんの略なんかな？って思ってたんですが、binaryの略（っぽい）です。
おそらくちょっと学習してきた方は/binディレクトリは見たことあると思います。

例えばお馴染み`mkdir`がどこにあるかをwhereisコマンドで見てみると、
![スクリーンショット 2021-12-01 14.11.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865635/aef9390e-2e85-019f-5c26-a968749e77f2.png)
※「whereis コマンド」でコマンド本体のライブラリやソースファイルのパスを参照できるコマンドです。

（/binディレクトリはシステム起動に必要なディレクトリであり、ルートパーティションから分割できないです。）

## /sbin
システム管理者用のコマンドを格納しているディレクトリです。
普段はあまり見かけないかなと思います。

いわゆるshutdown・rebootコマンドなどはここに格納されています。
（/sbinディレクトリはシステム起動に必要なディレクトリであり、ルートパーティションから分割できないです。）

## /etc
個人的には「エトセトラ」感はないんですが、エトセトラ。
システムの設定ファイルを格納しているディレクトリです。

.confファイルなどが格納されています。
（/etcディレクトリはシステム起動に必要なディレクトリであり、ルートパーティションから分割できないです。）

## /lib
共有ライブラリを格納しています。
実はpythonとかsystemdとかここにある。
（厳密に言えば、ここのpythonからコマンドの「python」を参照しているわけではない。）

（/libディレクトリはシステム起動に必要なディレクトリであり、ルートパーティションから分割できないです。）

## /dev
デバイスファイルを格納しています。
おそらくパーティションの作成とか・外部機器を使う以外に触れることはない。

（/devディレクトリはシステム起動に必要なディレクトリであり、ルートパーティションから分割できないです。）

## /home
一般ユーザのホームディレクトリ
一つのユーザしかいない場合はユーザ名のディレクトリが一つ存在している。
複数いればその数だけディレクトリが下にある
![スクリーンショット 2021-12-01 14.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865635/77975b08-c254-d176-3599-af7e1a184000.png)

ルートパーティションから分割可能。

## /usr
システム起動には不要なプログラムなどを格納
さきほどmkdirは/bin/mkdirにあることを確認しましたが、実はおなじみのtouchやgrepコマンドは/binディレクトリではなく、/usr/binディレクトリの方に格納されている。
（わざわざ覚えなくても十分生きていけます。）
![スクリーンショット 2021-12-01 14.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865635/eb6f17ea-d343-abb5-f2cd-568f4318904f.png)

/binにあるコマンドのように必須でないコマンドをたくさん格納しているため、読み込みが頻繁に発生する。

ルートパーティションから分割可能。

## /var
variableの略。
ログファイルなどの可変ファイルを格納

ときどき見かけるようなディレクトリのイメージが個人的にある。

ルートパーティションから分割可能。

## /opt
追加でインストールしたパッケージを格納
（基本的にインストールしたものが招かれる応接室）

たくさんインストールするとここがパンパンになりがち。

ルートパーティションから分割可能。

## /boot
linuxカーネルなどの起動に必須のファイルを格納
ちなみに自分の/optにはhomebrew とかあったので覗いてみるとDockerfileなどもありました。

ルートパーティションから分割可能。

## /tmp
一時ファイルの格納。
ほぼ見ない

ルートパーティションから分割可能。

# 「jupyter lab」コマンドのpathを通す過程をdockerfileでなぞる
以前たしかここでDockerfileでmecabとかsumyのセットアップする、みたいな記事を書いた気がしますが、Dockerfile のように環境構築時にすぐにjupyter labをコマンドとして使うためにはPATHを通す必要があります。

```
FROM ubuntu:latest
RUN apt update && apt install -y \
	curl \
	file \
	git \
	libmecab-dev \
	make \
	mecab \
	mecab-ipadic-utf8 \
	sudo \
	wget \
	vim \
	xz-utils

# install anaconda3 you can change the version if you want to 
WORKDIR /opt
RUN wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh && \
	sh Anaconda3-2021.05-Linux-x86_64.sh -b -p /opt/anaconda3 && \
	rm -f Anaconda3-2021.05-Linux-x86_64.sh

ENV PATH=/opt/anaconda3/bin:$PATH
RUN pip install --upgrade pip && \
	pip install mecab-python3 && \
	pip install mojimoji && \
	pip install unidic-lite

WORKDIR /
# get the ipadic-neologd
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git && \
	echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]
```

そのときにPATHを通すと言ってもいつもサイトを見ながらしていますが、このディレクトリ構造を理解すれば、（なんとなく）何をしていたのか？を理解できるのかなと思います。

若干ローカル環境とは違いますが、やっていることは同じなので、見ていきます。
該当箇所は以下

```
WORKDIR /opt
RUN wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh && \
    sh Anaconda3-2021.05-Linux-x86_64.sh -b -p /opt/anaconda3 && \
    rm -f Anaconda3-2021.05-Linux-x86_64.sh

ENV PATH=/opt/anaconda3/bin:$PATH
```

先程のように一時的なインストールは基本的に/optディレクトリでおこなうため、WORKDIRで場所を移動します。
その次に、wgetでソースを取得し、shコマンドを起動やらなんやらしています。

最後にENVコマンド（exportみたいなやつ）で、起動するために必要なコマンドが格納されている/bin（=/opt/anaconda3/bin）に「jupyter lab」コマンドがあるためこれを環境変数として設定して完了！

# 終わり
サラッとした解説だったかもしれないですが、闇雲にPATHを通していたあの頃と違って、
ちゃんと何をしているからコマンドが使えるのか？
を説明してきました。

linuxの学習は（自分は）かなり最初はとっつきにくく、華やかなコーディングや結果もでないのですが、やはりコンピュータを扱う上で大切な概念だと感じてきています。

ま、興味あればぜひ〜

今回参考にさせていただいた記事
[ディレクトリ構造](https://bi.biopapyrus.jp/os/linux/linux-directory.html)
[Linuxディレクトリ構造](https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332)