Successivo: Spazio-dei-nomi e funzionalità, Precedente: Gestione interna dei nomi, Su: Spazi-dei-nomi [Contenuti][Indice]
L’esempio seguente è una versione riveduta dell’insieme di script sviluppati in Leggere la lista degli utenti; lì si può trovare la descrizione del funzionamento del codice.
Questa riformulazione, opera principalmente di Andrew Schorr,
è piuttosto elegante.
Tutte le funzioni e le variabili di implementazione
sono nello spazio-dei-nomi passwd, mentre
le funzioni principali di interfaccia sono
definite nello spazio-dei-nomi awk.
# ns_passwd.awk --- accedere alle informazioni del file delle password
@namespace "passwd"
BEGIN {
# modificare per adattarlo al sistema in uso
Awklib = "/usr/local/libexec/awk/"
}
function Init( oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
{
if (Inizializzato)
return
oldfs = FS
oldrs = RS
olddol0 = $0
using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
using_fpat = (PROCINFO["FS"] == "FPAT")
FS = ":"
RS = "\n"
pwcat = Awklib "pwcat"
while ((pwcat | getline) > 0) {
Byname[$1] = $0
Byuid[$3] = $0
Bycount[++Totale] = $0
}
close(pwcat)
Contatore = 0
Inizializzato = 1
FS = oldfs
if (using_fw)
FIELDWIDTHS = FIELDWIDTHS
else if (using_fpat)
FPAT = FPAT
RS = oldrs
$0 = olddol0
}
function awk::getpwnam(nome)
{
Init()
return Byname[nome]
}
function awk::getpwuid(uid)
{
Init()
return Byuid[uid]
}
function awk::getpwent()
{
Init()
if (Contatore < Totale)
return Bycount[++Contatore]
return ""
}
function awk::endpwent()
{
Contatore = 0
}
Come si può vedere, questa versione segue anche la convenzione menzionata in Dare un nome a variabili globali in funzioni di libreria, secondo la quale i nomi di funzione e le variabili globali iniziano con la lettera maiuscola.
Quel che segue è un semplice programma di test. Poiché è in un file
separato, gli identificativi non qualificati saranno ricercati
all’interno dello spazio-dei-nomi awk:
BEGIN {
while ((p = getpwent()) != "")
print p
}
Ecco cosa succede quando il programma viene eseguito:
$ gawk -f ns_passwd.awk -f testpasswd.awk -| root:x:0:0:root:/root:/bin/bash -| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin -| bin:x:2:2:bin:/bin:/usr/sbin/nologin -| sys:x:3:3:sys:/dev:/usr/sbin/nologin …
Successivo: Spazio-dei-nomi e funzionalità, Precedente: Gestione interna dei nomi, Su: Spazi-dei-nomi [Contenuti][Indice]