マンダリンケーキのレシピ

RSS1.0Atom0.3

このブログのテーマ:
Linuxをいじる Windowsを飼い慣らす Solarisに悩む Firefoxを使い倒す Thunderbirdを使い倒す
W-ZERO3で仕事する Mindmap(マインドマップ)で仕事する
WRC(世界ラリー選手権)を観る 車を走らせる
日常の非日常を記録する
<< March 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
+ GREEN goo +

サイト内ウェブ
この検索は「緑のgoo」を利用してます
現在、本貢献中
+ TWITTER +
+ OTHER WORLD +
あわせて読みたい
+ KEY WORD +
+ DISPLAYED ENTRIES +
+ RECENT COMMENT +
+ RECENT TRACKBACK +
+ ACCESS ANALYZE +
カウンター 無料
seo 相互リンク 無料YouTube高速バス 予約
+ ADVERTISE +
 
スポンサーサイト

一定期間更新がないため広告を表示しています

- | | - | -
ファイルテスト演算子の罠
シェルスクリプトやPerlなどで、ファイルやディレクトリの状態を調べることは多々ある。
ディレクトリは書き込みできる状態か?
ファイルは存在するか?

そこでifの条件式にファイルテスト演算子を使って真偽を確認するというのは使い古された常套手段。

perlだと、
if(-e "/var/log/messages") {...}
というような使い方になる。

ファイルテスト演算子には次のような種類があり、よく使われるのは-rや-w、-xや-dなど。

Perl ファイル 【 バイクショップ パルス 】
-r ファイルやディレクトリが読み出し可能
-w ファイルやディレクトリが書き込み可能
-x ファイルやディレクトリが実行可能
-o ファイルやディレクトリをこのユーザーが所有している
-R ファイルやディレクトリが、実行ユーザーではなく、実ユーザーによって読み出し可能
-W ファイルやディレクトリが、実行ユーザーではなく、実ユーザーによって書き込み可能
-X ファイルやディレクトリが、実行ユーザーではなく、実ユーザーによって実行可能
-O ファイルやディレクトリが、実行ユーザーではなく、実ユーザーによって所有されている
-e ファイルやディレクトリが存在している。
-z ファイルが存在していて、かつ大きさが「0」である
-s ファイルやディレクトリが存在していて、かつ大きさが「0」でない
-f 普通のファイルである
-d ディレクトリである
-l シンボリックリンクである
-S ソケットである
-p 名前付きパイプである
-b ブロック特殊デバイスである
-c キャラクタ特殊デバイスである
-u ファイルやディレクトリが setuid されている
-g ファイルやディレクトリが setgid されている
-k ファイルやディレクトリの sticky ビットがセットされている
-t このファイルハンドルに対して isatty () が真である
-T テキストファイルである
-B バイナリファイルである
-M 内容が最後に変更されてからの日数
-A 最後にアクセスされてからの日数
-C inode が最後に変更されてからの日数

ただし、このファイルテスト演算子は、直感的な意味と機能が食い違っているように思える。

なぜそんな食い違いが起きてしまうかというと、この-rなどの演算子は実際に「ファイルやディレクトリが読み出し可能」と言うことではなく、その対象に、スクリプト実行ユーザに対して“r”のパーミッションが与えられているかどうかだからである。

この食い違いで一番勘違いしてしまいそうなのは、ディレクトリの状態を調べるとき。

書き込みできるディレクトリかどうか調べて、書き込みできるようならファイルを開いたり、読み込みできるディレクトリかどうか調べて、読み込みできるようならファイルを開くというようなことを考えてみる。

前者の場合、通常なら、
if (!-w $dir) {
    print "ERROR: Can't write $dir directory¥n";
    exit 1;
} else {
    open (OBJECT, ">>$dir_file") or warn "ERROR: Can't write $dir_file¥n";
    print OBJECT "test¥n";
    close (OBJECT);
}
と書いてしまいそう。

ところが、
d-w--w--w- 2 momoch users 4096 3月 25 18:07 testdir
というディレクトリだった場合はどうなのか。

実際にtouchコマンドでファイルで確認したところ、
[momoch@server01 18:07:58 ~]$ touch testdir/test
touch: cannot touch `testdir/test': 許可がありません
となってしまった。

ところがファイルテスト演算子“-w”で確認したところ、
[momoch@server01 18:09:09 ~]$ perl -e 'unless (-w "/home/momoch/testdir"){print "cant¥n"};'
特に問題ない。


書き込みできなかった原因は、お察しの通りパーミッションにxがないため。
“-r”や“-w”だけで判断すると危ないのだ。
[momoch@server01 18:09:33 ~]$ perl -e 'unless ((-x "/home/momoch/testdir")&&(-w "/home /momoch/testdir")){print "cant¥n"};'
cant←書き込みできない
と、このように“-x”を付け加える必要がある。


いろんなサンプルを見ても“-x”の記載がないため、これでいいんだと思っていた。
盲点だったなぁ。。。

スポンサーサイト

- | 01:55 | - | -
+ ASSOCIATED AFFILIATE +
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://momoch.jugem.jp/trackback/903
 

Copyright (C) 2004 paperboy&co. All Rights Reserved.

Powered by "JUGEM"