Open10

「PATHを通す」について調べてみた

manappemanappe

前提知識

zsh , bashの違い

zsh...ジィーシェル。bashの進化系的な認識。MacではCatalina以降標準に。かと言って全くの上位互換ではなく、bashでしかない機能もある。下記コマンドでどちらを使っているか確認できる。

terminal
echo $SHELL

シェルとは?

環境変数とは?

マシン上で共通で使える変数的なの。下調べ不十分。
https://qiita.com/fuwamaki/items/3d8af42cf7abee760a81
https://qiita.com/ryouya3948/items/8edbd5d744c83dd41141#exportコマンドとは

manappemanappe

パスとは?

Linux上でcd, mkdir, rmなど色々なコマンドが簡単に使えるのは、実はこのパスのおかげだったりする。

ターミナルのコマンドの仕組み

  • 「このコマンドを叩くとこういう処理をするよ」という実行ファイルを、コマンドごとに基本的には bin フォルダの中に格納してある。
  • このbinフォルダが、種別によって複数箇所に色々ある。パッケージのインストールで増えたりする。
  • コマンドの実行ファイルを探しにいくパスのことを コマンド検索パス と言う。

格納場所と中身見てみた

  • 下記コマンドでそのbinの場所を確認できる。
    terminal
    echo $PATH
    
    実行結果
    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    
  • ちなみに上記の結果は、/usr/local/bin, /usr/bin, /bin, /usr/sbin, /sbinの5箇所のコマンド検索パスを示す。
    • このいずれかのフォルダに、使いたいコマンドの実行ファイルが登録されていれば「PATHが通っている」のでコマンドが使える状態、逆に見つからなければコマンドを呼んでも呼んだ先に実行ファイルがないので command not found となり、PATHを通す 必要がある。
    • 同名の実行ファイルが複数のパスにあった場合、左のものから実行される。
  • $PATHは、前提知識の環境変数。

bin内のファイルはどこに何があるのか見てみた

  • /bin -> 標準のファイルっぽい。Linuxコマンドが格納されてる。ビルドインコマンド(シェルが標準搭載している)と言うの?
  • /usr/local/bin -> インストールしたモジュールやパッケージのPATHっぽい。
  • /usr/bin/env -> さっぱりわからん。機械語。
manappemanappe

gulp -v 時の command not foundを解決する

gulpのPATHが通っている例

/usr/local/bin
#!/usr/bin/env node

require('gulp-cli')();

目指す状態

パスが通っている状態 =コマンド(この場合は gulp )実行ファイルが、環境変数$PATH内に登録されていて、コマンドを叩いた時に呼び出す先リストに当該binフォルダが追加されている状態。

よく言う 「パスを通す」 = $PATH内に、呼びたいコマンドの実行ファイルを格納したbinの場所を知らせる。

解決方法

  • 下記でパスを通せるが、ターミナルを閉じると変更が失われる。
    terminal
    export PATH=/xxx/bin:$PATH
    
    • bashの場合~/.bashrcや~/.bash_profile、zshの場合~/.zshrcなどが設定ファイルなので、この中に直接パスを追記する方法も。
  • 次に下記で変更を永続させる。
    terminal
    source ~/.bashrc
    // or
    source ~/.zshrc
    
  • また、Node.jsよりinstallした場合、/usr/local/binとなることが一般的。
    • この場所はroot権限が必要なので、sudoを使ってinstallする。[cf]

マッチョに解決

  • GitHubリポジトリ等でbinを確認、実行ファイルをパスの通ったディレクトリに置く。

補足:モジュールのインストールの仕組み cf.

npm installしたらツールも含めnode_modulesに入る。モジュールがbin(コマンド)を持っているなら、npmはそれをnode_modules/.binに入れる決まりがある。

npm binでbinの場所を確認する

  • npm bin localのbinの場所を確認
  • npm bin -g globalのbinの場所を確認
  • 上記で確認したパスの場所を、 export PATH=/xxx/bin:$PATH の/xxx/に代入する。
manappemanappe

わからないこと・聞きたいこと

社内のエンジニアさん達に教えてもらい次第更新します。

  1. グローバルインストールとローカルインストールでPATHの必要/不要が異なる?
    予想:
    • グローバル -> マシン上どこでも使えるようにするために、PATHを通す必要がある。
    • ローカル -> package.jsonに依存関係を記述するので不要。
  2. パス通す必要もなく使える場合も多くあるのに、インストール時に通っていない(ずれてしまう)場合があるのはなぜ?
  3. 一度通したパスが、他にインストールしたパッケージで書き換えられたりすることはないの?
  4. gitコマンドにエイリアスを設定できるように、オリジナルのコマンド名付けられたりするの?(する必要まったくないけど)
  5. パッケージをインストールした際に、そのパッケージの実行ファイルがどこに入ったのかはどう確認すればいいの?(PATHを通すにもどこに通したらいいのかわからない) -> 解決
  6. binと.binがあるのはなんの違い?
manappemanappe

関連コマンド

// パスを確認
echo $PATH
// /xxx/binにPATHを追加。最後の:$PATHがないと置き換えてしまうので注意。
export PATH=/xxx/bin:$PATH
// コマンドの格納場所を探す
which vi 
// 環境変数一覧
printenv
manappemanappe
  • ファイルに対しての権限の理解が必要
    • ls -la で出てくるファイルの情報を理解する
      • アクセス権, 所有者,所有グループ
      • パーミッション調べる
manappemanappe

ファイルのパーミッションとは

参考にしたブログ

例えば…

drwxr-xr-x   15 manahigurashi  staff     480  4  4 21:16 src
-rw-r--r--    1 manahigurashi  staff     160  2  7 22:17 tailwind.config.js
  • 1文字目
    • d: ディレクトリ
    • -: ファイル
    • l: シンボリックリンク
  • 2〜10文字目は、3文字ごとに権限を表す
    • 2-4: ファイルの所有者に対する権限
    • 5-7: ファイルのグループに対する権限
    • 8-10: その他に対する権限
  • 構成される文字
    • r: read - 読み取り
    • w: write - 書き込み
    • x: - 実行

パーミッション変更の仕方

  chmod 764 index.html
  • コマンドの数字の意味
    • 4: 読み取り権限を与える
    • 2: 書き込み権限を与える
    • 1: 実行権限を与える
  • 上記数字の合計値で、[r][w][x]に対する権限の設定を表している。
manappemanappe

テキトーなディレクトリでnpm i -G gulpしようとした時に出たエラー

mbp:npm manahigurashi$ npm i -G gulp
npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/npm/node_modules
npm ERR! code EACCES
npm ERR! syscall access
npm ERR! path /usr/local/lib/node_modules/npm/node_modules
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules'
npm ERR!  [Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules/npm/node_modules'
npm ERR! }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/manahigurashi/.npm/_logs/2021-04-10T07_48_02_204Z-debug.log

あと、なぜかgulpコマンドを打つとNot Foundなのに、npm run startとかは通る場合がある。なんなんだ。

manappemanappe

グローバルインストール先、つまりどこにモジュールがインストールされているのか調べたい場合は、

$ npm root -g
/usr/local/lib/node_modules

[cf]