Perlで学ぶ「詳解 UNIXプログラミング」(その6) 第6章 システムデータファイルと情報

はじめに

「詳解 UNIXプログラミング」の第六章を示します。

6.1 getpwnam関数

getpwnamは/etc/passwdの内容を取得する関数なのですが、
Perlでの仕様がよくわからない。普通は 7つしかフィールドがないのに
9個の値が返ってくる。ドキュメントがあればいいのですが、
perldoc -f getpwnamしても何も出てこないのでなんともいえないですね。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;
binmode STDOUT, ":utf8";

# getpwnam関数
my @params = qw(
  ログイン名
  暗号化されたパスワード
  ユーザID
  グループID
  リアルネーム
  ホームディレクトリ
  シェル
);

my $name   = shift or die "Usage: $0 username\n";
my @passwd_info = getpwnam($name);

die "Can't get '$name' info\n" if scalar @passwd_info == 0;

# 4番目と 5番目の内容が不明. perldocに何も記載がない

my @info = @passwd_info[0..3,6..8];
while (@params && @info) {
    my $val   = shift @info;
    my $param = shift @params;

    print "$param:$val\n";
}

仕様が謎なので、/etc/passwdを split /:/した方がいいかもしれないですね。

まとめ

「詳解 UNIXプログラミング」の第六章を示しました。


getpwnamは Perlでは使わない方がいいかと思います。

追記

getpwnamの戻り値の数が struct passwdと一致しない問題については
id:gfxさんのはてなブックマークコメント欄を参照してください。