PATHの優先度は左側がより優先される

開発環境

> go version
go version go1.18.4 darwin/amd64

> uname -v
Darwin Kernel Version 22.1.0: Sun Oct  9 20:14:54 PDT 2022; root:xnu-8792.41.9~2/RELEASE_X86_64

モチベーション

XcodeのBuild Phasesで意図しない参照先のバイナリが実行されてしまった。これはPATHの優先度を意識していれば解決できた問題だった。ということで実際に2つのバイナリを別のディレクトリ配下に配置してPATHの優先度を見る。

準備

package main

import (
    "log"
)

func main() {
    log.Println("executed in d1")  // or "~ d2"
}

go build で適当なバイナリを作って2つディレクトリを用意してそれぞれに配置。

> tree
.
├── d1
│   └── tekitou
└── d2
    └── tekitou

PATHの最後尾にパスを追加(検索優先度が低い)

パスを追加する。

> export PATH=${PATH}:~/d1

> echo $PATH
~{TOTEMO_NAGAI}:~/d1

実行する。

> tekitou
2022/11/18 01:19:04 executed in d1

PATHの先頭にパスを追加(検索優先度が高い)

(「最後尾 対義語」でググった。最後尾は単数っぽいけど最前列は複数っぽくて気持ちが悪いので先頭を採用)

パスを追加する。

> export PATH=~/d2:${PATH}

> echo $PATH
~/d2:{TOTEMO_NAGAI}:~/d1

実行する。

> tekitou
2022/11/18 01:22:04 executed in d2

d1ディレクトリもPATHに含まれているが左(記述順)が優先されるので先頭に追加したd2ディレクトリ配下のバイナリが実行された。

優先度を意識していると何かのエラーハンドリング時に効きそう。PATH周り、パソコンの入門中の入門な気がしていて頭に無かったのがショック。愚直にやっていこう。