こんにちは、さるまりんです。
今回はsort
コマンドの実験です。
こんなファイルがあります。
cities.txt
なごや
さっぽろ
やまぐち
おおさか
とうきょう
せんだい
かごしま
なは
ひらがなで日本の都市名がいくつか記録されています。
僕の開発環境であるmacOS Venturaのマシンでこのファイルに単純にsort
コマンドをかけてみます。
$ sort cities.txt
なは
なごや
おおさか
かごしま
さっぽろ
せんだい
やまぐち
とうきょう
並び順は変わりましたが、五十音順になったわけではないですね。
これを次はこんな風に環境変数LANG
を指定してsort
コマンドをかけてみます。
$ LANG=ja_JP.utf8 sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち
お!五十音順になりましたね。
今度はAmazon Linux上に同じファイルを置いてやってみます。
シンプルにsort
をかけます。
$ sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち
お!すでに五十音順で並んでいますね。
同じようにLANG
を指定してみます。
$ LANG=ja_JP.utf8 sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち
同じ結果が得られました。
差は何か?
どちらのマシンでもlocale
コマンドを実行してみます。
まずはmacOSのマシン。
$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=
次はLinuxです。
$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
めちゃくちゃ細かいですがLANG
のja_JP.UTF-8
がmacOSではダブルクオートに囲まれていて、Linuxでは囲まれていません。
その違いは何かをlocale
コマンドのmanpageで見てみるとこんな風に書いてあります。
Values for variables set in the environment are printed without double quotes, implied values are printed with double quotes.
簡単に訳してみます。
「環境内で設定された変数の値はダブルクオートなし、暗黙の値はなしで出力されます」
と言うことなので、macOSの方はLANG
が明示的に設定されておらず暗黙の状態だったので、五十音順に並び替えられなかったと推測されます。(違うかもしれませんが。。)
環境差ってこう言うところから生まれるのですね。
環境違いでプログラムの挙動が変わったらまずは調査。
env
コマンドで環境変数の一覧を見る、locale
コマンドでロケールの情報を見る。
この辺りから始めるのがいいかもしれないです。
環境違いで動かないとかハマることが多いです。
いろんなトラブル対応の方法を勉強していきたいと思います。
読んでくださってありがとうございました。
それではまた!