があります。
ファイルのパーミッション演算子 `-r', `-R', `-w', `-W', `-x', `-X' の解釈は、ファイルのモードとユーザの実効/ 実 uidと実効/実 gid のみから判断されます。実際にファイルが読めたり、書 けたり、実行できたりするためには、別の条件が必要かもしれません。スーパー ユーザには、`-r', `-R', `-w', `-W' に対して、常に 1 が返り、モード中のいずれかの実行許可ビットが立っていれば、`-x', `-X' にも 1 が返ることにも注意してください。スーパーユーザが実行す るスクリプトでは、ファイルのモードを調べるためには、stat() を行なうか、 uid を一時的に別のものにする必要があるでしょう。
例:
while (<>) { chop; next unless -f $_; # 通常ファイル以外はスキップ ... }
-s/a/b は、置換演算 (s///) の符号反転ではありません。しかし、-exp($foo) は期待どおりに動作します。マイナス記号の後に英字が 1 字続くときにのみ、 ファイルテストと解釈されます。
ファイルテスト `-T' と `-B' の動作原理は、次のようになっていま す。ファイルの最初の数ブロックを調べて、変わった制御コードや上位ビットが セットされているような、通常のテキストには現れない文字を探します。そのよ うな文字が、たくさん (>30%) 見つかるようであれば、そのファイルは `-B' ファイルであると判断され、それほど見つからなければ、`-T' ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナ リファイルとみなされます。`-T' や `-B' をファイルハンドルに対 して用いると、最初のブロックを調べる代わりに、標準入出力バッファを調べま す。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときに EOF に達していたときには、`-T' も `-B' も「真」を返します。
どのファイルテスト (あるいは、stat() や lstat()) 演算子にも、下線だけか ら成る特別なファイルハンドルを与えると、前回のファイルテスト (や stat) の stat 構造体が使われ、システムコールを省きます。(`-t' には使えま せんし、lstat() や `-l' は実ファイルではなく、シンボリックリンクの 情報を stat 構造体に残すことを覚えておく必要があります。) 例:
print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;
$cnt = chmod 0755, 'foo', 'bar'; chmod 0755, @executables;
$cnt = chown $uid, $gid, 'foo', 'bar'; chown $uid, $gid, @filenames;
passwd ファイルから数値表現でない uid を検索する例を示します:
print "User: "; chop($user = <STDIN>); print "Files: " chop($pattern = <STDIN>); ($login,$pass,$uid,$gid) = getpwnam($user) or die "$user not in passwd file"; @ary = <${pattern}>; # ファイル名の展開 chown $uid, $gid, @ary;
stat()
関数と同じことをするが、シンボリックリンクが指しているファ
イルではなく、シンボリック自体の stat
をとります。シンボリックリン
クがシステムにインプリメントされていないと、通常の stat()
が行な
われます。
umask
で修正したもの) で作成します。成功時には 1 を返し、失敗
時には 0 を返して $! (errno)を設定します。
stat
に失
敗した場合には、空リストを返します。普通は、
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
のようにして使います。
下線だけの _ という、特別なファイルハンドルを、stat
に渡すと、実
際には stat
を行なわず、stat 構造体に残っている、前回の
stat
やファイルテストの情報が返されます。例:
if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\n"; }
(これは、NFS のもとでデバイス番号が負になるマシンでのみ動作します。)
eval
を使用します:
$symlink_exists = (eval 'symlink("","");', $@ eq '');
truncate
がインプリメントされていなければ、致命的エラーとなります。
$cnt = unlink 'a', 'b', 'c'; unlink @goners; unlink <*.bak>;
注: スーパーユーザ権限で、Perl に `-U' を付けて実行した場合でなけれ
ば、unlink
でディレクトリを削除することはありません。この条件にあ
う場合にも、ディレクトリの削除は、ファイルシステムに多大な損害を与える可
能性がありますので、特に注意が必要です。rmdir
を代わりに使ってく
ださい。
touch
コマンドの例です:
#!/usr/bin/perl $now = time; utime $now, $now, @ARGV;
Go to the first, previous, next, last section, table of contents.