rcmdnk's blog
Last update

覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54

だいぶ前に Bashでの一時ファイルの取り扱い という話を書きましたが、 ここでBSDのmktempコマンドはGNUの物と違って面倒だ、的な事があったのですが、 その問題が消えてた件。

Sponsored Links

以前あったmktempのGNU/BSDの違い

mktempコマンドは適当な一意的な名前を作成してくれ、 その名前をファイル名として一時的な出力に使ったりすることが出来ます。

デフォルトでは適当なランダムな名前を$TMPDIR以下に作成してくれるので、 スクリプトの中で、

1
2
3
4
5
#!/bin/sh
logfile=$(mktemp) # /tmp/tmp.XXXXXXXXXX
echo test output > $logfile
cat $logfile
rm -f $logfile

みたいな使い方が出来ます。 (XXXXXXXXXXの部分がランダムな文字列になります。)

複数の同じようなプロセスを走らせる場合にも 被らないので便利。

ですが、上の例はGNUの場合で、 BSDのmktempだと引数なしで使うとエラーが出るので、

$ mktemp -t tmp

の様にプレフィックス部分を指定して上げる必要がありました。

OS X 10.11 El Capitan

これが、今、OS X 10.11 El Capitanにアップグレードした 手元のMacで見てみると、普通に

$ mktemp
/var/folders/XX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/X/tmp.XXXXXXXX

と、引数無しで使えました。(MacのTMPDIRは上のような階層でディレクトリも常に変更されます。)

マニュアルを見てみると(man mktemp)、以下の様な文がありました。

If no arguments are passed or if only the -d flag is passed mktemp behaves as if -t tmp was supplied.

まんま引数なしの場合には-t tmpと同じ様になるよ、と書いてあります。

一番下にあるHISTORYを見てみると、December 30, 2005となっていますし、 今更アップデートされる様なところでもないと思ってたんですが、 ちょっと探してみると、WebにあるMac Developer Libraryのページに、

mktemp(1) Mac OS X Manual Page

10.9 Mavericksの時のマニュアルがあって、 ここを見ると上の文章がありません。

実際、前に書いた時は2013年でMavericksの時の話なので mktempは引数なしでは使えないと言うのは正しかったんだと思います。

もう手元にMavericksもYosemiteも無いので確かめられませんが。

それ以外の違いとしては

On case-insensitive file systems, the effective number of unique names is significantly less; given six `Xs', mktemp will instead select 1 of 2176782336 (36 ** 6) possible unique file names.

という一文が入っていますが、 この直前に、

 The number of unique file names mktemp can return depends on the number of `Xs' provided; six `Xs' will result in mktemp selecting 1 of 56800235584 (62 ** 6) possible file names.

という文が入っています。

この文は以前もあったものなのですが、 ランダムな文字列の総数として、アルファベット26文字 x 2 (大文字、小文字) + 数字(10) = 36の組み合わせ という計算になっていますが、 新しい文にあるように、ファイルシステムによっては大文字、小文字を区別しないものもあるので この様なところでは26 + 10 = 36だけ、と言うことです。

実際、Macでは通常大文字小文字を区別しないのでこれに当たります。

この文についてはより正確に表現を変えただけで 中身が変わったわけではないと思います。

まとめ

ということで、少なくともMac OS X 10.11 El Capitanでは mktempコマンドを使う際に 引数無しでGNUと同じ様に使うことが出来ます。

スクリプト等でMacとLinux両方で使える様な物を作る場合にも 今後はこの部分を気にせずに使える様になります。 (他のBSDを使わないとするならば。)

10.10 Yosemiteの時にどうだったかは分かりませんが、 いつの間にか変わっていた様です。

探して見る限り全くこの辺情報が見当たらないのですが… (何故かDeveloper Libraryにはコマンドのマニュアルは10.9のものしか見当たらない。。。)

追記: 2015/10/23

Yosemiteで試してみましたが、Yosemiteではまだ引数無しだと使えませんでした。

なので、この変更はEl Capitanから入ったものの様です。

他のコマンドでもアップデートがあるかもしれませんが、 全く情報が無い。。。

追記ここまで

Sponsored Links
Sponsored Links

« AnkerのUSB充電器が便利 OS X 10.11.1 El Capitanリリース »