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]