dateコマンド
dateコマンドは、コマンドを実行した時点でシステムが管理している日時を表示するものだ。逆にシステムの時間を設定する目的でも使われる。ただし、システムが仮想環境で動作している場合には、仮想環境側が時刻を調整しているので明示的にdateコマンドで時刻の設定を行うことはまずないだろう。また、仮想環境であってもNTPを使って時刻同期を行う機能が働いていれば、これまたdateコマンドで時刻を設定することはないはずだ。
そうなるとdateコマンドは現在時刻、または指定した時刻の日時データを指定したフォーマットで出力させる、というのが主な用途ということになる。
出力フォーマットの指定方法には多少の違いはあるものの、POSIXで定められている部分なのでほとんどのケースで互換性がある。POSIXの範囲内で使っている限り、MacのdateコマンドもLinuxのdateコマンド(Coretulsのdateコマンド)も大した違いはない。
問題となるのは、拡張機能を使う場合だ。特にLinux dateコマンド(Coretuls dateコマンド)の拡張機能を多用している場合、その方法は基本的にLinux dateコマンド(Coretuls dateコマンド)でしか使えないということを把握しておこう。
Linux dateコマンド(Coreutils dateコマンド)の拡張機能
Linux dateコマンド(Coreutils dateコマンド)とMac dateコマンドの違いについては、以前軽く触れたと思う。日時の前後を指定するオプションとその指定内容が異なっており、互換性は全くない。Linux dateコマンド(Coreutils dateコマンド)には、さらにこれに加えて「--file」というオプションが用意されており、日時の前後を指定するオプションである「--date」で指定する内容をファイルに書いておけるようになっている。
わかりにくいので実際のサンプルで動作を見てみよう。
まず、向こう1カ月間の日付一覧が欲しいとする。Linux dateコマンド(Coreutils dateコマンド)であれば--dateオプションで日付をずらすことができるので、このオプションを指定して1カ月分、コマンドを繰り返し実行すればよいことになる。
しかし、Linux dateコマンド(Coreutils dateコマンド)では--dateオプションで指定する内容をファイルに書いておき、それを読み込んで実行する「--file」というオプションが用意されている。例えば、次のような感じで--dateオプションで指定すべき内容をファイルに書いておく。1行に1オプション分の指定となる。
dataファイル
1 days
2 days
3 days
4 days
5 days
6 days
7 days
8 days
9 days
10 days
11 days
12 days
13 days
14 days
15 days
16 days
17 days
18 days
19 days
20 days
21 days
22 days
23 days
24 days
25 days
26 days
27 days
28 days
29 days
30 days
31 days
ここで次のようにdateコマンドを実行する(MacならCoreutilsをインストールした状態でdateではなくgdateコマンドを実行する)。
Coreutils dateコマンド --fileオプションの使用例
date --file data
実行すると次のようになる。
--dateオプションであれば繰り返し実行しなければならないところだが、--fileオプションを使うと1回の実行で済んでいる。
ちなみに、Mac dateで同じことをしようとしても次のようにエラーになる。
--fileオプションはLinux dateコマンド(Coreutils dateコマンド)に特有の機能なので、Mac dateで実行しようとしても、そもそもそのオプションはないとエラーになっている。
Mac dateで同じことを実行する
Mac dateに--fileオプションはないが、日時をずらす機能は提供されているので、次のように実行すれば同じ結果を得ることができる。
--fileオプションと同じようなことをさせるサンプル
for i in $(seq 1 31); do date -v+${i}d +'%a %b %d %T %Z %Y'; done
実行すると次のようになる。
Linux dateコマンド(Coreutils dateコマンド)の--fileオプションで指定しているファイルをそのまま使って同じことをしたいとなると、前述したようにワンライナーにするのではなくシェルスクリプトにしたほうがわかりやすいかと思う。
コマンドを使うべき? プログラミング言語を使うべき?
Linux dateコマンド(Coreutils dateコマンド)の--fileオプションは時に便利だ。特に大量のデータを生成するケースでは、1回ごとにコマンドを起動するのと、--fileオプションを指定して1回のコマンド起動で全ての処理を行うのとでは、処理時間が結構違ってくる。
しかし、--dateオプションで指定する日付のずらし方は標準化された指定方法とは言いにくいし、「--date」で指定する内容をファイルにまとめるための--fileオプションはさらに独特だ。ほかの実装系には用意されていないことが多い。ある特定の用途ではバチッとはまることがあるものの、あまり汎用的に利用できる機能ではない。このオプションを指定する必要があるようなケースでは、プログラミング言語かそれに近いプログラムを使ったほうが良いのではないかと思う。
コマンドを使うか、シェルスクリプトにまとめるか、何らかのプログラミング言語を使うかは判断が難しいところだ。どうしてもその間のグレーゾーン的な部分は存在する。結局は本人の好みや慣れの問題になってくるのだが、少なくとも、同じコマンド名であってもほかの実装系には存在しない機能もあるということは知っておいたほうが良いだろう。
個人的には、ある程度難しくなってきたら汎用的なプログラミング言語を使うことをお薦めしたい。使用言語は何でも良いが、今時に行くならPythonだろうか。または、コンパイル型のプログラミング言語で、その用途に応じたコマンドを開発して使うのも良いと思う。その場合は、C/C++もよい候補だ。何せ速いし、手間はかかるが慣れてしまえばクロスプラットフォームのコマンド開発も難しくはないからだ。