bashのtestコマンドで少しハマった

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

背景

dotfile類をgitで管理していて複数環境で読み込んでいる。 同一の設定を利用したい。問題が2つ。

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

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

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

対応

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

1
2
3
4
5
6
7
8
# 関数定義
$ 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つしか確認できない。

comments powered by Disqus