BashでPATHに実行ディレクトリを追加する処理を.profile(.bash_profile)や.bashrcに追加するときに便利なshell関数をメモしておきます。.profile(.bash_profile)とかに追加して使ってもらえれば幸いです。
仕様
- 指定されたディレクトリが存在し、
- すでにPATHに含まれていないとき、
- PATHの(前|後ろ)に指定ディレクトリを追加してexportする。
ちゃんとPATHにふくまれてないかチェックするので.bashrcにこれらの関数でPATHを追加しても安心。(チェックしてないで.bashrcに書いてしまうとbashを入れ子で起動するたびにPATHに追加されてしまう)
# 指定されたディレクトリをPATHの前に追加(pre)
addpathp () {
[ ! -d $1 ] || [ -z "${PATH##*$1*}" ] || export PATH=$1:$PATH
}
# 指定されたディレクトリをPATHのあとに追加(after)
addpatha () {
[ ! -d $1 ] || [ -z "${PATH##*$1*}" ] || export PATH=$PATH:$1
}
# 例
addpathp ~/.local/bin # .local/binが存在し、すでにPATHに存在しないなら、それをPATHに追加
addpatha ~/.cargo/bin
addpatha ~/go/bin
addpatha /usr/local/go/bin
addpathp ~/bin
解説
こういったPATH追加関数は過去に何度も再発明されていますが、超短いので邪魔にならないのが自慢です。
あとの説明は蛇足ぎみですが書いておきます。なんにも考えないでコピーして使えばよいですw
テクニカルな解説
Bashの関数については「Shellの基本を学ぶ(7)関数」に解説があります。
[ ! -d $1 ] ||
ディレクトリが存在しないとき、test( [ )コマンドはTRUEになるので、||以降のコマンドを実行しません。こういう [...] || ... , [...] && ... というif文を使わないパターンはshell scriptでは定石ですね。
[ -z "${PATH##*$1*}"]
変数置換については「bashの変数内文字列置換まとめ」とかググってみてください。このケースでは指定したディレクトリがPATH変数の中に存在する場合、空文字列となり全体はTRUEになり||以降を実行しません。存在しないとき||以降を実行します。
残り
PATHを加工して前につける関数をaddpathp、後ろにつける関数をaddpathaとして定義しているだけです。