🤔

【macOS,シェル,Node.js】何故動くについて段階的に理解した記録

2021/05/25に公開

何について書く?

  • macOSのシェルがどのような動きをしているのか。Node.jsでreact.jsなどのPJファイルが何故動くのかなど、普段何気なく使用しているPC環境について段階的に理解を深めた記録です。段階的に理解を深めたため、同じく初学者の方のお力になれたら幸いです。

内容

●説明順番

  • LinuxやmacOS
  • シェルとは?
  • macOSのディレクトリー構成
  • Node.jsとPJファイルが動く理由

●macOSやLinux

【ここでの登場人物】
Unix━BSD━macOS
  ┗Linux

Unix

  • macOSやLinuxOSはUnixから始まっている。
  • 1969年にアメリカベル研究所で生まれたUnixは多くのOSの土台になっている。
  • 大部分がC言語で書かれている。
  • ライセンス契約がある。

Linux

  • フィンランドの大学生(リーナス・トーバルズ)がUnixを参考にして作成したのがLinux(LinusがUnixを参考にしたOS⇒Linux) カーネルの構造はUnixと異なり1から作成されている。
  • オープンソースソフトウェア(OSS)
  • サーバーOSとしてよく用いられている。
  • 同氏はgitの生みの親でもあると言うから驚きである。

macOS

  • Unixの派生版 BSDを基に作成された。
  • Unixコマンドが使える。

●シェルとは?

【ここので登場人物】
ユーザー(私)→ターミナル(CLI)→シェル→カーネル→ハードウェア

  • シェルはユーザーとOS中核の仲介役の事。
  • カーネルはOSの中核となる部分であり、プログラムとハードウェアを仲介する。(CPUやメモリ・ハードディスクなどにアクセスする手段を提供する役割を担っている)
  • ただカーネルは機械語にて動くのでユーザーから直接指示を出せない。
  • そこでシェルを使いユーザーがターミナル(黒い画面)で入力したUnixコマンドをカーネルに理解できる機械語変換して伝えてもらう。その逆も然り。
  • Unixコマンドをひとまとめにして.sh拡張子をつけたものをシェルスクリプトという。面倒な作業をいちいちコマンドを打つことなく実行できるメリットがある。
  • CLIのシェルは、大きくBシェル系とCシェル系(Bシェルを基にスクリプト構文をC言語風にアレンジして配列の使用を可能にしたシェル)がある
  • macOS Catalina からデフォルトシェルがzsh(Bシェル系)になった。
  • ちなみにシェルはCLIを指すことが一般的だが、マウス操作などのGUIをベースであるグラフィカルシェルもその一つとして位置する。(macOSであればFinderがグラフィカルシェル名に当たる)

【zshrcなどのzsh関連のファイルの意味】

前提情報(ログインシェル・インタラクティブシェル・シェルスクリプトとは?)

  • ログインシェル:最初に起動するシェル(ログイン時)・サーバー立ち上げ時はじめに立ち上がるシェル
  • インタラクティブシェル:ログインシェルから起動されるシェル (ターミナル画面で複製して出てきた zshやbashと直打ちしてbashが起動した状態など。)
  • シェルスクリプト:.shファイルでシェルの操作を記載し、起動するだけでその操作を行ってくれるもの。

zsh設定ファイル群

ファイル名 内容 root,home読み込み順
.zshenv 影響範囲最大、前提情報の全登場人物に影響 root→home
.zprofile ログインシェルに必要な情報、ログイン時1回だけ読み込まれる root→home
.zshrc ★最も使う。ログインシェル、インタラクティブシェルの場合に読み込まれる root→home
.zlogin zprofileとほぼ同じだが最後に読み込まれる。併用は避けたほうがいい。 root→home
.zlogout ログアウト時、exitコマンド時に読み込まれる。 home→root
※設定ファイル別の読み込み順zshenv > zprofile > zshrc > zlogin
※rootのパスは 「/etc直下」homeのパスは「~/直下」
rootに設定を書けばシステム全体、homeに書けばユーザー単位で設定されるということである。

●macOSのディレクトリー構成

パス 機能
/ ルートディレクトリ
/Applications 全ユーザが利用可能なアプリケーション
/Users 各ユーザのホームディレクトリ
/Library 全ユーザが利用可能なアプリケーションの設定
/Volumes ハードディスクやUSBなどの外部記憶媒体と接続する際のマウントポイント
/System OSのファイル
/cores カーネルのコアダンプ
/bin コマンドラインで使用する必須コマンド
/dev プリンタやマウス等の各種デバイスにアクセスするために使用するファイル類
/etc システム全体用の設定ファイル
/opt ユーザーがインストールした静的データ、主にプログラムを格納
/private /varや/tmp, /etcの実体
/sbin コマンドラインで使用する必須コマンドのうちシステムのメンテナンス等に用いられるコマンド
/tmp 一時的に保存するファイルやディレクトリを配置。再起動や期間で削除される
/usr ユーザが使用するコマンドやマニュアルを配置
/var ログファイルなどを保存するディレクトリでシステムが利用
  • ルートディレクトリーは全ユーザーに関わる中核の機能が入っている。
  • ユーザーはUsersディレクトリー配下に作られる。ホームディレクトリーと呼ばれる。
  • 各ユーザーの設定に関して、設定ファイルをルート→ユーザーディレクトリーの順番に読み込んで行く。例:zshの設定ファイルでルートディレクトリー/etc/zshrcが読まれた後ユーザーのホームディレクトリー配下~/.zshrcが上書きで読まれる。

●Node.jsとPJファイルが動く理由

Node.jsとは

  • Google Chromeでも使用されるV8エンジン上で動くJavaScript実行環境。
  • このエンジンで、スクリプトを読み込み(パースし)jsを機械語に変換し実行される。

node.jsインストール・PJファイルに合わせたバージョンのNode.jsを起動

  • Node.jsパッケージングソフトnodenvを使用(https://qiita.com/1000ch/items/41ea7caffe8c42c5211c)
  • nodenvはホームディレクトリーにインストールされる。(※もしもnodenvを使用せずhttps://nodejs.org/ja/公式のインストーラを使用した場合は、Node.jsの本体はルートディレクトリー/usr/bin/nodeにインストールされる。)
  • nodenv配下にvarsionsがあり各Node.jsのバージョン別ディレクトリーがある。
  • nodenv global バージョン1 をすればホームディレクトリー配下どこからでもその指定したバージョン1のNode.js環境を使用可能。PJディレクトリーにてnodenv local バージョン2を実行すると、そのPJディレクトリーではバージョン2のNode.jsにて実行が可能になる。
  • 補足:npm(yarn)インストールについて。2種類ある。
  • グローバルインストールは、ホームディレクトリー配下全てに影響を与える部分にインストールされる。package.jsonが作られない。
  • ローカルインストールはPJディレクトリー配下で行うならば、package.jsonが作成され、そこのnode_modulesにインストールされる。 PJで使用するものは基本的にlocal インストールがいい。→何をインストールしたかがpackage.jsonに記録されてgitで管理している際他の人に渡すときも環境ごと伝えることができるため。

参考サイト

macOSやLinux

シェルとは?

macOSのディレクトリー構成

Node.jsとPJファイルが動く理由

Discussion