TL;DR
[[ ... ]]
と[ ... ]
で全然意味が違うらしいという話
※zshとかbash以外のシェルは管轄外です
結論
[[ ... ]]
を使うことにする
発端
.bashrc
を整理していたら、どうにも動いていない設定が見つかった
if [ -x $(which colordiff) ]
then
alias diff='colordiff '
else
alias diff='diff '
fi
colordiff
コマンドがあればそれをdiff
のエイリアスにしようとしていたらしい
たまたま新しい環境でdiff
コマンドを叩いた時にエラーになっているのを見つけた
$ diff a b
-bash: colordiff: command not found
すごく残念なことになってる…
調査
以下参考にさせていただきました
GoogleのShell Style Guideにも[[ ... ]]
を使う!って書いてあるみたい
恥ずかしながら[
がtest
コマンドを表すみたいな内容はなんとなく知っていたが、[
と[[
の違いをちゃんと意識したことはなかった
AND条件&&
とOR条件||
の書き方なんかは[[ ... ]]
の方が直感的にわかりやすく感じた
# [ ... ] でAND/OR
if [ -f ${FILE_PATH_A} ] && [ -f ${FILE_PATH_B} ]
then
# 両方trueのときの処理
...
fi
# [[ ... ] でAND/OR
if [[ -f ${FILE_PATH_A} && -f ${FILE_PATH_B} ]]
then
# 両方trueのときの処理
...
fi
基本bashでしか書く機会ないのでGoogleに乗っかろうと思いつつ、自分以外のコードで出会うときのために細かい違いは抑えておかねばと決意した
修正
先の動いてないコードは以下のように修正した
if [[ -x $(which colordiff) ]]
then
alias diff='colordiff '
else
alias diff='diff '
fi
これで無事にcolordiff
なんてない環境でも普通にdiff
が動き、colordiff
がある環境ではdiff
のエイリアスとしてcolordiff
が効いてくれるようになってくれた
自戒
なんちゃってdotfilesはちゃんと検証して使おう