test([])-aオプションの両側でコマンドの実行結果を利用しようバッククォート呼び出しをしたら失敗した。 結局testコマンドを&&で繋いだ。

背景

.bashrcなどのdotfileはgitで管理している。 複数環境に対応させ(様とし)ている。問題が2点あった。

  • 実際に存在しないPATHも読み込んでしまっている
  • .bashrcの再読み込みでPATHに重複するディレクトリが登録される

これらのために下を行うことにした。

  • ディレクトリの存在確認を行う
  • $PATHに既にないか確認する

対応

最初に書いたように[]のオプションに`を含める方法は上手く動かなかった。 そこで&&で繋ぐことにした可読性が下がるので略記もやめてtestを繋げることにした。

# 関数定義
function add_path {
    if test -d $1 && test `echo ${PATH} | grep -v $1` ; then
        export PATH="$1:${PATH}"
    fi
}
# 使用例
add_path "/usr/local/bin"

これで2つの問題の多くは解決する。 ただeval "$(rbenv init -)"の実行が${PATH}を変更し単純に追記してるので、 $PATHが伸びる問題は完全には解決していない。

一旦は別の問題として対応する事にした。

もしかしたら-aが上手く動かなかったのはバッククォートでの実行がtestコマンドよりも先に実行されるためかもしれない。 2つ使っていたか記憶が怪しいが、2つのバッククォート実行が並んでいたら終了ステータスは1つしか確認できない。