会社の製品の性能検証を行うことになり、データセンターに行ってきた。

問題は、検証環境を構築し、テストデータをリストアした時に発生した。
テストデータのチェックを行ったところ、破損が確認されたのだ。

ちなみに、テストデータの破損チェックは、以下のような手順で行った。

1. テストデータの各ファイルの md5 チェックサムを取得し、
md5.txt というテキストファイルに書き出すスクリプトを作成
  (スクリプトの内容は、読み飛ばしてもらって結構です。)
#! /bin/bash

# find /test_data -type f | sort > /tmp/data_files

# while read file
> do
> openssl dgst -md5 file >> md5.txt
> done < /tmp/data_files

2. テストデータ作成環境で上記スクリプトを実行し、
md5.txt を md5.txt.org という名前に変更

3. 検証環境で上記スクリプトを実行

4. テストデータ作成環境で取得した md5.txt.org と
検証環境で取得した md5.txt を比較する
# diff /tmp/md5.txt.org /tmp/md5.txt


ところが、良く調べてみると手順 1 で作成したスクリプトにバグが有ったらしい。
スクリプトの結果作成される md5 チェックサムを書き出したテキストファイルが、
環境に依存するようだ。

環境依存するのは、スクリプト中の以下の行にある、"sort" コマンドだ。
# find /test_data -type f | sort > /tmp/data_files

"sort" コマンドをオプション無しで実行すると、標準入力の内容を
辞書順に並べかえて標準出力に書き出す。

問題は、この "辞書順" が環境によって異なることだ。
例えば、私のテスト環境では "A" の方が "a" より先だったが、
先輩の環境では逆だった。

man コマンドには、特筆するべき事は書いていない。
特に、"辞書順" を規程するオプションも見当たらなかった。

途方にくれて、google 検索をしてみると、以下のページが見つかった。


要約すると、"sort" の結果は環境変数によって異なるとのこと。
"sort" 実行時には、
  "LC_ALL=C sort"
とすれば、環境に依らず一定の結果が得られるらしい。
(上記コマンドは "sort" 実行時のみ、環境変数 "LC_ALL" を "C" にする)

寡聞にして "LC_ALL" という環境変数は知らなかったが、
取り合えず実行すると、私の環境でも先輩の環境でも "A" の方が "a" よりも
先にくるようになった。

しかし、まだ問題は残っていた。
"." や "_" の表示順が異なるのだ。

エンジニアとして、ここは sort の実行順を詳細に調査するべきだが、
あいにくと時間が無い。

とりあえず、
"LANG=C sort"
にしたら全て上手く言った。
でも、後学のために、いつか調査をした方がよいな。。