続:test(1)でシンボリックリンクか否か判定する時のオプションは-hなのか-Lなのか?

id:eel3:20121117:1353150478 の続き、だろうか? あれから3年ちょっと経つが、test(1)でファイルがシンボリックリンクか否か判定する時に-hと-Lのどちらを使うべきか、未だに迷い続けている。「どちらでもよい」と言われるとかえって迷ってしまう、難儀な性格だ。

ところで、POSIXにはどう書いてあるのだろうか? 以前の記事ではこう書いていた。

POSIX的にはどうなのだろうか? 出所が怪しいのだけど、POSIX Programmer's Manual (2003) には-hと-Lのどちらも載っていて、しかもどちらを使うべきかの記述はない。

あらためて調べてみた。

どちらも-hと-Lの記述がある。記述内容は全く同じ。どちらを使うべきかの記述もない。

ただ、次のような気になる記述があった。

The -h operand is added for symbolic links, and access permission requirements are clarified for the -r, -w, and -x operands to align with the IEEE P1003.2b draft standard.

http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html

オプション-hは「IEEE P1003.2b draft standard」で追加されたらしいが、それって何? ググったらこんなものが出てきた。

これは1999年の文書のようだ。Abstractを見ると:

Abstract: P1003.2b is part of the POSIX series of standards for applications and user interfaces to open systems. It consists of modifications and clarifications to ISO/IEC 9945-2: 1993 (IEEE Std 1003.2-1992), including support for symbolic links, a new archive/interchange format, and other modifications and clarifications prompted by ISO/IEC balloting.

http://www.open-std.org/jtc1/sc22/open/n2972.pdf

どうやらPOSIX 2 (IEEE Std 1003.2-1992) 改善のための変更や、不明点の明確化を図った文書のようだ。タイミング的に、IEEE Std 1003.1, 2001 Editionで取り込まれたのだろうか? この文書でオプション-hが追加された、ということは、POSIX 2の段階ではオプション-hの記述は無かったということになる。

ではオプション-Lはどうなのか? あと「POSIX 2の段階ではオプション-hの記述は無かった」という推測は正しいのか? 調べようとしたが、IEEE Std 1003.1, 2004 Editionよりも前のPOSIXはWeb上では見れないようだ……。

ただ、IEEE P1003.2b Draft 12のAbstractに「including support for symbolic links」と書いてあって、何となく「シンボリックリンク機能についての記述も本文書で追加しまっせ」という感じではないかと思われるので、「POSIX 2にはシンボリックリンク関連の記述が無かった≒オプション-Lの記述も無かった」のではないかとエスパーしている。

その傍証ではないが、IEEE Std 1003.1, 2004 Editionにこんな記述がある。

The -L and -S operands are added for symbolic links and sockets.

http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html

こんな一文を付け加えているということは、オプション-Lの記述は「後付け」だったのではないだろうか? POSIX 2は(シェルとシェルコマンドについての)最初のPOSIXだった訳で、初っ端の文書に「後付け」ってのは考えにくい。POSIX 2の次、IEEE Std 1003.1, 2001 Edition以降で追加されたのではないか?

ということで、POSIXを調べたが、結局「test(1)の-hと-Lのどちらを使うべきか」の結論は出なかった。