Přeskočit na obsah

Digital Command Language

Z Wikipedie, otevřené encyklopedie
(rozdíl) ← Starší revize | zobrazit aktuální verzi (rozdíl) | Novější revize → (rozdíl)

DCL - Digital Command Language je příkazový jazyk používaný na většině operačních systémů vyvinutých firmou Digital Equipment Corporation (firma byla převzata firmou Compaq, která byla převzata firmou Hewlett-Packard), především na OpenVMS a starším systému RSX-11. Počátky DCL lze nalézt v operačních systémech IAS, TOPS-20 a RT-11.

Jazyk DCL lze používat jak pro interaktivní práci, tak pro pasní příkazových skriptů.

Nápověda DCL je znak $ (lze změnit příkazem SET PROMPT = "řetězec").

Příkazový řádek začíná jménem příkazu. Jména příkazů, souborů, kvalifikátorů jsou case-insensitive. Lze používat zkratky (DIR=DIRE= ... =DIRECTORY).

Místo voleb se používají tzv. kvalifikátory /SLOVO, které není nutné oddělovat mezerou od jména příkazu a jiných parametrů.

Některé kvalifikátory umožňují zadat jednu nebo více hodnot /SLOVO=hodnota; více hodnot se uzavírá do závorek:

DIFF /COM=EXCL /IGN=(COMMENTS,BLANK_LINES)

Některé příkazy akceptují na místě parametru tvořeného jménem souboru několik jmen oddělených čárkou (před i za čárkou mohou ale nemusí být mezery).

Příkaz HELP poskytuje nápovědu. Je možné mu zadat jako parametry přímo kus příkazového řádku a HELP vypíše nápovědu k dalším parametrům.

DCL umožňuje vytváření příkazových souborů. Mají příponu .COM a spouštějí se @jméno. Před příkazy v příkazových skriptech je zvykem psát znak $. Pokud se to nedělá, interpret se občas zlobí. Komentáře začínají znakem ! a mohou být za příkazem nebo na samostatném řádku; pokud jsou na samostatném řádku začíná řádek dvojicí znaků $!. Pokud se má ve skriptu vynechat řádek, je nejbezpečnější na něj také umístit dvojici znaků $!.

Výběr z příkazů VMS:

TYPE soubor    vypíše soubor na obrazovku
TYPE/PAGE soubor  vypisuje soubor na obrazovku po obrazovkách; ukončení Q
PRINT soubor   vytiskne soubor na tiskárnu
DELETE soubor  smaže soubor (stačí DEL)
PURGE soubor   smaže starší verze souboru (/BEFORE= pro upřesnění které)
PUBLIC soubor  nastaví práva souboru, aby byl dostupný pro všechny
PRIVATE soubor nastaví práva souboru, aby nebyl dostupný pro všechny
COPY co kam    kam je nutné uvést (např. *.*)
RENAME co kam
MC DFU SEARCH DSA0 /FILE=jméno   Rychlé hledání souborů, DSA0 je jméno disku
               ve jméně mohou být použity žolíky
EDIT soubor    editor, fungují kursorové klávesy, klávesou PF4 (mínus na
               numerické klávesnici) se vstupuje do příkazového režimu,
               zde příkazy HELP, pohyb PgUp, PgDn, ukončení Enter, nápověda
               ke konkrétnímu příkazu: slovo Enter, QUIT ukončení bez
               uložení, EXIT - uložení a ukončení
HELP           nápověda
SET PASSWORD   změna hesla
DIR            výpis adresáře
DIR/SIZE
DIR/PROT       výpis adresáře s právy
DIR/OWNER      výpis adresáře s vlastníkem souborů
CREATE jméno   vytvoří soubor, spustí editor pro zadání jeho obsahu, ukončení
               pomocí Ctrl-Z
CREATE/DIR [jméno]  vytvoří adresář; k adresáři nemá uživatel právo delete,
                    pro smazání je nutné zadat set file/prot=(o:rwed) jméno.dir
SET DEFAULT cesta   změna aktuálního adresáře
DOWN podadresář     přepnutí do podpreasáře; nefunguje všude - použij
SET DEFAULT [.subdir]
SHOW DEFAULT        vypsání jména aktuálního adresáře
SET PROT=práva soubor   nastavení práv
SET FILE/PROTECTION=(s:rwed,o:rwed,g:re,w) soubor   nastavení práv s: je systém,
                        o: je vlastník, g: skupina, w: ostatní (world)
                        rwed = read, write, execute, delete
WAIT hh:mm:ss.cc        čeká zadný čas (jako sleep v Unixu)
SHOW TERMINAL           vypíše nastavení terminálu
SET TERMINAL volby      nastavení terminálu:
                        /INSERT  - režim vkládání
                        /PAGE=n  - počet řádků na stránce
                        /WIDTH=n - počet znaků na řádku
SORT /KEY=(POS:<pozice>,SIZE:<delka>,DECIMAL,{ASCENDING|DESCENDING}) vstup výstup

Lze používat žolíky (fungují jako v MS-DOSu *.*, resp. *.*;* pro všechny verze)

Zdroj: http://dfrench.hypermart.net/fancyIndex/Training/Unix%20Bourne%20Shell/toc.html

Zkopírování celého podstromu:

BACKUP [ODKUD...] [KAM...]

Zkopírování podstromu do archivního souboru (tzv. BACKUP save set):

BACKUP [ODKUD...] soubor /SAV

Obnovení podstromu ze souboru

BACKUP soubor /SAV kam !restore

Výpis obsahu *.BCK souboru:

BACKUP subor.BCK /SAV /LIST

Kopírování zamčeného souboru

BACKUP /IGNORE=INTERLOCK soubor;verze kam

Pro OpenVMS existuje program ZIP pro vytváření .ZIP archivů. Pokud se mají zachovat OpenVMS atributy souborů, které zajistí jejich bezproblémové rozbalení a používání na jiném systému, je nutné používat parametr "-V":

ZIP "-V" archiv.ZIP soubor soubor ...
UNZIP "-V" archiv.ZIP

Ve verzi ZIPu, který je na testovacích systémech nelze pracovat s adresářovými stromy.

Když ve VMS spustí uživatel nějaký program, původní uživatelův proces se uspí. Výjimkou je použití příkazu RUN/PROCESS=name.

Přesměrování vstupů výstupů se v DCL dělá přiřazením logických jmen SYS$OUTPUT, SYS$INPUT nebo SYS$ERROR k souboru nebo zařízení. Místo here dokumentů se používá SYS$INPUT:

$ TYPE SYS$INPUT
prvni radek
druhy radek
treti
$! pokračování skriptu

Jméno souboru SYS$COMMAND slouží ke čtení vstupu z klávesnice od uživatele:

$ READ/END_OF_FILE=návěští/ERROR=návěští/TIME_OUT=sekund/PROMPT="výzva: " -
  SYS$COMMAND proměnná

Pomlčka na konci prvního řádku znamená pokračování příkazu na dalším řádku (pokračovací řádky nezačínají znakem dolar). Tento příkaz vypíše výzvu, a čeká max. zadaný počet sekund na načtení jednoho řádku z klávesnice. Při chybě a při zadání znaku konce souboru skočí na uvedená návěští.

Vstup od uživatele uloží do proměnné zadané posledním parametrem.

Unixovému příkazu

myprog < input.dat > a.lis

odpovídá ve VMS

ASSIGN/USER A.LIS SYS$OUTPUT
ASSIGN/USER INPUT.DAT FOR005
RUN MYPROG

Podobně jako v MS-DOSu nebo v unixových shellech má DCL internerní příkazy: ASSIGN, CALL, DEFINE, GOSUB, GOTO, IF, RETURN, SET, STOP, ...

Definice příkazů

Standardní způsob definice příkazů je použití CLD (Command Language Definition) definic nebo foreign commands.

Pokud má být možné spouštět program SYS$SYSEXE:FOO.EXE příkazem FOO, který může přijímat kvalifikátor "/BAR", je třeba vytvořit CLD soubor obsahující:

DEFINE VERB FOO
   IMAGE "SYS$SYSEXE:FOO.EXE"
   QUALIFIER BAR

soubor se umístí do libovolného adresáře a provede se

SET COMMAND cesta:FOO.CLD

tím se do tabulky příkazů procesu vloží informace o příkazu FOO. Nevím, jak se tyto informace vypisují.

Foreign commands se definují jako symboly:

FOO :== "$SYS$SYSEXE:FOO.EXE"

Další informace viz

http://www.answers.com/topic/digital-command-language http://h71000.www7.hp.com/doc/82final/6100/6100PRO.HTML http://www.encompassus.org/ftplib/VS0169_VMS94A_TK_KILL_AAAREADME_DOC.html

DCL pod OpenVMS používá logické jméno DCL$PATH jako DOSové nebo unixové PATH - jako seznam jmen adresářů, ve kterých má hledat programy (*.EXE a *.COM soubory). DCL$PATH může obsahovat více jmen adresářů oddělených čárkami.

DIR DCL$PATH:jmeno.*

Zjištění, jestli je přístupný příkaz UNZIP a případně jeho nadefinování:

$ IF F$SEARCH("DCL$PATH:UNZIP.*") .EQS. "" .AND. F$TYPE(UNZIP) .EQS. "" THEN UNZIP == "$CMG$TOOLS:UNZIP"

Jména souborů

Zdroj: http://en.wikipedia.org/wiki/Files-11

Systém souborů: Files-11 - vývojové varianty:

- ODS-1: plochý systém souborů pro RSX-11 - ODS-2: hierarchický systém souborů pro VMS, max. 8 úrovní adresářů, ve jménech

       souborů povolena pouze velká písmena angl. abecedy, číslice, podtržení,
       pomlčka a dolar, max. 39 znaků jméno a 39 znaků přípona

- ODS-5: rozšířená verze ODS-2 pro Alphy a Itanium, ve jménech souborů povoleny

       Unicode znaky, rozlišuje malá velká písmena, dlouhá jména, neomezený
       počet úrovní adresářů

- (ODS-3 je podpora pro ISO 9660 CD-ROM pro Files-11 a ODS-4 podpora pro High

       Sierra CD-ROM)

Struktura jména souboru v rámci clusteru:

NODE"user password"::device:[dir.subdir]filename.type;ver

Libovolná část jména může být vynechána, existují implicitní hodnoty pro jednotlivé části jména (nahrazuje funkci aktuálního adresáře v jiných systémech): např. [DIR1.DIR2]FILE.EXT je poslední verze souboru FILE.EXT na aktuálně implicitním disku v adresáři [DIR1.DIR2]. DIR1 je podadresář MFD (master file directory = kořenový adresář), DIR2 je podadresářem DIR1. MFD libovolného disku je označováno [000000].

[000000]          kořenový adresář
[cesta]           absolutní cesta (začíná v kořenovém adresáři) 
[dir.sub.subsub]  oddělovač jmen adresářů je tečka
[]                aktuální adresář
[.cesta]          relativní cesta (začíná v aktuálním adresáři)
[-]               nadřízený adresář
[-.-]             adresář o 2 úrovně výše
[adresář...]      tři tečky znamenají včetně podadresářů

Každý proces má implicitní hodnoty pro jméno disku a adresář (bohužel na rozdíl od MS-DOSu stejný pro všechny disky), a většina systémových rutin ve VMS je umožňuje používat včetně přípony souboru; např. pro příkaz TYPE je implicitní přípona ".LIS", takže příkaz TYPE F bude pracovat se souborem F.LIS. Podobně při překladu programu v jazyce C:

EDIT SOUBOR.C
CC SOUBOR
LINK SOUBOR
TYPE SOUBOR
DIR SOUBOR
RUN SOUBOR

CC překládá SOUBOR.C a vytváří SOUBOR.OBJ (a protokol o překladu SOUBOR.LIS, který lze vypsat příkazem TYPE SOUBOR), LINK linkuje SOUBOR.OBJ a vytváří SOUBOR.EXE, DIR vypíše všechny soubor SOUBOR.*, RUN spouští SOUBOR.EXE.

Každý soubor má číslo verze: nový soubor má verzi 1, a při každém zápisu do souboru se soubor nepřepisuje, ale vytvoří se soubor s číslem verze o 1 větším; staré verze se mažou až po dosažení určitého limitu (který se nastavuje příkazem SET FILE/VERSION_LIMIT). Max. číslo verze dané architekturou je 32767.

Při vytváření jména souboru obsahujícího znaky, které nejsou dovoleny v ODS-2, se před problémovými znaky píše znak "^": na soubor se jménem "file.tar.gz;1" na disku s ODS-5 je třeba se odkazovat jako na "file^.tar.gz" jméno je "file.tar", přípona ".gz".

Soubory v adresářích jiných uživatelů jsou dostupné uvedením jména USER:[jméno] Odkaz na podadresář je [.jméno], nadřízený adresář [-].

MAIL e-mailový klient - nápověda MAIL>

Příkaz set copy_self send,reply nastaví ukládání odesílaných a forwardovaných zpráv (platí i pro další spuštění). Další příkazy send, reply, forward, read/new, dir, delete číslo, exit. Zadáním adresy příjemce @jméno se pošle mail na všechny adresy uvedené v souboru jméno.DIS. send jméno odešle soubor. Další nápověda je na http://www.blacksheepnetworks.com/security/resources/helpline-vms/ například jak napodobit kolony:

Místo unixového

prog1 | prog2 | prog3

použít

$ DEFINE/user sys$output temp1.txt
$ prog1
$ DEFINE/user sys$input  temp1.txt
$ DEFINE/user sys$output temp2.txt
$ prog2
$ DEFINE/user sys$input  temp2.txt
$ prog3

případně (na novějších systémech)

PIPE prog1 | prog2 | prog3

u mnoha příkazů je ale nutné zadat SYS$INPUT nebo SYS$OUTPUT na místě jména souboru - např. u SEARCH (obdoba GREP) nebo WRITE (obdoba ECHO):

SEARCH SYS$INPUT vzorek
WRITE SYS$OUTPUT "Text"

Další nápověda na: http://www.openvms-rocks.com/~RUSH/commands.txt (uloženo jako vms-commands.txt).

Symboly a logická jména

VMS masivně používá symboly a logická jména. Symboly lze využívat pouze v DCL - jsou obdobou unixových proměnných shellu a příkazových aliasů. Logická jména jsou dostupná i v jiných programech - jsou obdobou proměnných prostředí na Unixech. Logická jména se ukládají do tabulek symbolů, obvykle se používají pro definování odkazů na disky a adresáře, někdy i pro definici příkazových aliasů, což může způsobovat problémy, protože aliasy nastavené třeba v LOGIN.COM jsou platné i uvnitř skriptů, takže běžné příkazy se nemusí chovat jak je obvyklé a očekávané. Často používaný znak dolar v logických jménech (nebo i ve jménech volání systému) nemá žádný speciální význam.

Symboly

Symboly mohou být

- lokální - platí pro 1 proces - globální - platí i pro potomky procesu

Je-li definován lokální i globální symbol se stejným jménem, má lokální přednost.

Globální (zůstanou nastaveny i po opuštění *.COM skriptu, který je nastavil) symboly se nastavují pomocí příkazu

jméno :== "řetězec"
jméno == výraz

lokální pomocí

jméno := "hodnota"
jméno = výraz

Pokud jsou ve výrazu použity lexikální funkce (F$jméno), je nutné používat == nebo = a ne :== nebo :=.

Za určitých podmínek nemusí být použity uvozovky a mezery kolem symbolu přiřazení nebo rovnítka. Uvozovky zajišťují, že v řetězci nebudou posloupnosti mezer nahrazovány jednou mezerou a malá písmena velkými.

Je-li v nastavení hodnoty symbolu použita hvězdička, lze při použití jméno symbolu zkracovat až na řetězec před hvězdičkou.

Pro zjištění hodnot symbolů slouží příkaz

SHOW SYMBOL

bez dalšího parametru se doptá na jméno symbolu, s kvantifikátorem /ALL vypíše všechny lokální symboly, s kvantifikátory /ALL/GLOBAL vypíše všechny globální symboly, se jménem symbolu (lze použít i žolíky * pro libovolný řetězec a % pro libovolný znak) vypíše hodnotu nebo hodnoty příslušného symbolu nebo symbolů (lokálních i globálních - jen jedny z nich lze specifikovat pomocí /LOCAL nebo /GLOBAL). Příkaz SHOW SYMBOL musí dostat jméno symbolu napsané velkými písmeny - pokud se napíše bez uvozovek, DCL ho na velké písmena převede; ale pokud se napíše malými písmeny v uvozovkách, tak je problém.

Příklad příkazových aliasů:

HOME == "SET DEFAULT SYS$LOGIN"
TP == "TYPE/PAGE"
DS == "DIRECTORY/SIZE"
SQ == "SHOW QUOTA"
LL == "DIR/SIZE/OWNER/PROT"

Rušení symbolů:

DELETE /SYMBOL jméno
DELETE /SYMBOL/GLOBAL jméno

Pro zjištění, zda je symbol definován, lze použít funkci F$TYPE, která vrací type symbolu (STRING, INTEGER) a pro neexistující symbol vrací prázdný řetězec; jméno symbolu musí být v argumentu F$TYPE bez uvozovek:

$ IF F$TYPE(ABC) .EQS. ""
$ THEN
$   WRITE SYS$OUTPUT "Symbol ABC neni definovan"
$ ENDIF

V unixových shellech je nutné vyhodnocení proměnné vyžádat uvedením znaku dolar před jménem proměnné; text bez uvozovek se nechává jak je, pouze se posloupnosti mezer nahradí jednou mezerou.

DCL je na půlce cesty mezi unixovými shelly a programovacími jazyky: jména souborů v normálních příkazech se píšou bez uvozovek, ale v příkazech, které pracují s řetězci, je nutné řetězce uzavírat do uvozovek. Pokud není jméno uzavřeno v uvozovkách, považuje se za jméno symbolu a použije se hodnota symbolu. Uzavřením jména do apostrofů se vyvolá další úroveň vyhodnocení.

Pokud se jméno symbolu napíše do apostrofů, bude se pracovat se symbolem, jehož jméno je hodnotou toho prvního symbolu (čili je to vlastně odkaz na symbol):

ABC = 123
JMENO := "ABC"
WRITE SYS$OUTPUT "JMENO"
WRITE SYS$OUTPUT JMENO
WRITE SYS$OUTPUT 'JMENO'

První WRITE vypíše řetězec JMENO, druhý ABC a třetí 123. Jméno v apostrofech lze použít i na levé straně přiřazovacího příkazu.

Uvnitř uvozovek lze vyhodnotit symbol tak, že se před jeho jméno napíšou dva apostrofy a za něj jeden:

WRITE SYS$OUTPUT "Hodnota symbolu JMENO: ''JMENO'"

Logická jména

Logická jména se definují příkazem

ASSIGN hodnota jméno

nebo (pozor, pořadí parametrů je obrácené!)

DEFINE jméno hodnota

Pro zjištění hodnot logických jmen slouží příkaz

SHOW LOGICAL jméno

který provede rekurzivní vyhodnocení (a ve jménu lze používat žolíky), nebo

SHOW TRANSLATION jméno

který provede pouze jednoduché vyhodnocení.

Příkaz

SHOW LOGICAL /ALL

vypíše všechna logická jména včetně informace, ve které tabulce jsou umístěna.

Zrušení logického jména provede příkaz

DEASSIGN jméno

Pro získání hodnoty logického jména je nutné použít lexikální funkci F$TRNLNM:

WRITE SYS$OUTPUT F$TRNLNM("jméno")

Umístění domovského adresáře je uloženo v logickém jméně SYS$LOGIN. Ale za posledním jménem adresáře chybí tečka, takže ho nejde používat jako jméno disku.

Definice kláves

Význam kláves lze předefinovat pomocí

DEFINE/KEY/NOLOG PF1 "CLEAR"/TERMINATE
DEFINE/KEY/NOLOG PF2 "MAIL"/TERMINATE

Psaní skriptů v DCL

Všechny řádky skriptu obsahující příkazy musí začínat znakem $ (na první pozici). Komentářové rádky musí začínat dvojicí znaků $! . Aby se příkazy nevypisovaly před provedením, je nutné použít SET NOVERIFY.

Parametry skriptu jsou dostupné jako symboly P1, P2, ... P8.

Příkaz

INQUIRE jméno "řetězec"

vypíše řetězec:, přečte řádek z klávesnice a hodnotu uloží do symbolu jméno

Lexikální funkce

Funkce užitečné pro psaní skriptů. Umožňují např. provádět řetězcové operace, číst systémové hodnoty apod. Popis lze získat příkazem

HELP LEXICALS

Vybrané lexikální funkce:

F$TYPE(jmeno)

- vypíše typ symbolu jmeno nebo prázdný řetězec, pokud není symbol definován.

F$TRNLNM(logical)

- expanduje hodnotu logického jména

F$PARSE("smsc_data:ext_smpp_la_template.cnf")

- expanduje zápis jména souboru i když zápis obsahuje logická jména; lze použít pro ověření, zda soubor existuje

F$GETSYI(item [,node-name] [,cluster-id])

vrací identifikaci a status systému.

F$EDIT(string, edit-list)

Druhý parametr je seznam požadovaných editačních akcí. Jejich jména jsou oddělena čárkami a uzavřena v uvozovkách:

COLLAPSE    Odstraní všechny mezery a tabelátory tr -d '[:space:]'
            nebo sed -e 's/[ \t]//g'
COMPRESS    Nahradí posloupnosti mezer a tabelátorů jednou mezerou
            tr -s '[:space:]' nebo sed -e 's/[ \t][ \t]*/ /g'
LOWERCASE   Nahradí velká písmena malými (tr [:upper:] [:lower:])
TRIM        Odstraní úvodní a koncové mezery a tabelátory
            (sed -e 's/^[ \t]*//' -e 's/[ \t]$//'
UNCOMMENT   Odstraní komentáře - vykřičníky mimo uvozovky a vše za nimi
UPCASE      Nahradí malá písmena velkými (tr [:lower:] [:upper:])

Pozor: nemění části řetězce uzavřené v uvozovkách!

username = F$EDIT(F$GETJPI(0,"USERNAME"),"TRIM")

Symbol username uzavřený v normálních apostrofech lze pak používat v dalších příkazech.

Jméno aktuálního stroje:

node = F$GETSYI("NODENAME")

Symbol F$MODE() vrací řetězec INTERACTIVE, když se jedná o interaktivní session (*.COM spuštěný uživatelem buď přímo nebo z jiného *.COM), BATCH pokud se jedná o dávkové spuštění, dlaší možnosti jsou NETWORK a OTHER.

Vybrání podřetězce z řetězce

Následující řádek uloží do výstup část řetězce za hranatou závorkou z obsahu symbolu jméno:

výstup = F$EXTRACT(F$LOCATE("]",jméno)+1,F$LENGTH(jméno),jméno)

F$LENGTH(jméno) vrátí délku celého řetězce, který je obsahem symbolu jméno; úplně správně by zde mělo být F$LENGTH(jméno)-(F$LOCATE("]",jméno)+1), ale pokud je zadaná délka větší než kolik znaků zbývá do konce řetězce, vezme se prostě část řetězce od zadané pozice až do konce. Obojí je lepší než 99 uváděné v různých příkladech, které nebude fungovat pokud do konce řetězce zbývá více než 99 znaků.

Výraz

řetězec - podřetězec

vrátí řetězec, z něhož je vypuštěn podřetězec

Funkce F$LOCATE(substring,string) vrátí pozici podřetězce v řetězci. Je-li podřetězec hned na začátku, vrací 0; není-li obsažen v řetězci, vrací délku řetězce. Proto je nutné porovnávat výsledek s délkou řetězce (óóó, jak důvtipné!):

IF F$LOCATE(":",VARIABLE) .EQ. F$LENGTH(VARIABLE) THEN ...

Funkce F$ELEMENT(n, delimiter, string) vrací n-tý prvek z řetězce string; prvky jsou vzájemně odděleny řetězci delimiter. Číslování je od nuly!

Více viz http://www.djesys.com/freeware/vms/dclprog.ppt

Parametry F$GETJPI:

ACCOUNT          APTCNT            ASTACT             ASTCNT
ASTEN            ASTLM             AUTHPRI            AUTHPRIV
BIOCNT           BIOLM             BUFIO              BYTCNT
BYTLM            CLINAME           CPULIM             CPUTIM
CREPRC_FLAGS     CURPRIV           DFPFC              DFWSCNT
DIOCNT           DIOLM             DIRIO              EFCS
EFCU             EFWM              ENQCNT             ENQLM
EXCVEC           FAST_VP_SWITCH    FILCNT             FILLM
FINALEXC         FREP0VA           FREP1VA            FREPTECNT
GPGCNT           GRP               IMAGECOUNT         IMAGNAME
IMAGPRIV         JOBPRCCNT         JOBTYPE            LAST_LOGIN_I
LAST_LOGIN_N     LOGIN_FAILURES    LOGIN_FLAGS        LOGINTIM
MASTER_PID       MAXDETACH         MAXJOBS            MEM
MODE             MSGMASK           NODENAME           NODE_CSID
NODE_VERSION     OWNER             PAGEFLTS           PAGFILCNT
PAGFILLOC        PARSE_STYLE_PERM  PARSE_STYLE_IMAGE  PGFLQUOTA
PHDFLAGS         PID               PPGCNT             PRCCNT
PRCLM            PRCNAM            PRI                PRIB
PROC_INDEX       PROCESS_RIGHTS    PROCPRIV           RIGHTSLIST
RIGHTS_SIZE      SHRFILLM          SITESPEC           SLOW_VP_SWITCH
STATE            STS               SWPFILLOC          SYSTEM_RIGHTS
TABLENAME        TERMINAL          TMBU               TQCNT
TQLM             TT_ACCPORNAM      TT_PHYDEVNAM       UAF_FLAGS
UIC              USERNAME          VIRTPEAK           VOLUMES
VP_CONSUMER      VP_CPUTIM         WSAUTH             WSAUTHEXT
WSEXTENT         WSPEAK            WSQUOTA            WSSIZE

Význam vybraných parametrů (viz skript WQ.COM):

PRCNAM     Process name, jméno procesu
IMAGNAME   File name of the current image, jméno souboru v němž je prováděná
           image
DFWSCNT    Default working set size
WSAUTH     Maximum authorized working set size
WSAUTHEXT  Maximum authorized working set extent
WSEXTENT   Current working set extent
WSPEAK     Working set peak
WSQUOTA    Working set size quota
WSSIZE     Process's current working set limit
GPGCNT     Global page count in working set
PPGCNT     Process page count
VIRTPEAK   Peak virtual address size  
PGFLQUOTA  Paging file quota, maximální počet virtuálních stránek
PAGFILCNT  Remaining paging file quota
PAGEFLTS   Count of page faults, počet výpadků stránky

Zdroj: soubory OVMS_731_DCL_REF1.pdf od Talata.

Na VAXech byla stránka paměti 512 bytů, na Alphách může být 8, 16, 32 nebo 64 KB. Pagelet je stránka o velikosti 512 na všech architekturách.

Funkce F$FAO("formátovací řetězec", argument, ...) funguje podobně jako printf (ale jinak, proč kopírovat nějaký za... Unix?). Formátovací direktivy:

!SL celočíselná hodnota
!AS řetězcová hodnota
!3(AS) 3 řetězcové hodnoty (3 parametry)
!#(#AS) první # znamená, že se počet opakování má přečíst z parametru, druhý
        # znamená, že šířka pole se má přečíst z parametru

formáty:

AS   vloží řetězec
OB   zkonvertuje byte do osmičkového zápisu
OW   zkonvertuje word do osmičkového zápisu
OL   zkonvertuje longword do osmičkového zápisu
XB   zkonvertuje byte do šestnáctkového zápisu (%02X)
XW   zkonvertuje word do šestnáctkového zápisu (%04X)
XL   zkonvertuje longword do šestnáctkového zápisu (%08X)
ZB   zkonvertuje byte do desítkového zápisu
ZW   zkonvertuje word do desítkového zápisu
ZL   zkonvertuje longword do desítkového zápisu
SB   zkonvertuje unsigned byte do desítkového zápisu
SW   zkonvertuje unsigned word do desítkového zápisu
SL   zkonvertuje unsigned longword do desítkového zápisu
!/   \n
!_   \t
!^   \f
!!   !

Výsledek provedeného příkazu

Výsledek provedeného příkazu je v symbolu $STATUS. Liché hodnoty jsou OK, sudé znamenají chybu.

Zjišťování existence souboru

$ IF F$SEARCH("cesta:soubor") .EQS. "" THEN WRITE SYS$OUTPUT "Neexistuje"

Zjišťování existence adresáře

$ DEFINE /USER SYS$OUTPUT NLA0:
$ DEFINE /USER SYS$ERROR NLA0:
$ DIR [.EMPTYX]ABC.TXT
$ IF $STATUS = "%X1001C04A"
$ THEN
$   WRITE SYS$OUTPUT "Adresar [.EMPTY] neexistuje"
$ ENDIF

Na jméně souboru (zde ABC.TXT) nezáleží. Pokud soubor náhodou existuje, pak existuje i adresář a vrátí se status %X00000001, pokud existuje adresář, ale soubor ne, vrátí se status %X10018290. Pokud adresář neexistuje, vrátí se status %X1001C04A.

Nastavování displeje v X

OpenVMS má příkazy SHOW DISPLAY a SET DISPLAY. Příkaz SET DISPLAY umožňuje pomocí kvalifikátorů měnit i jednotlivé složky nastavení beze změny ostatních hodnot:

SET DISPLAY /SERVER=0

Na stroji, kde není DISPLAY vůbec nastaven, je potřeba pro otevření DECtermu na specifikovaném X-displeji:

$ SET DISPLAY /CREATE /TRANSPORT=TCPIP /NODE=10.224.138.12 /SERVER=0 /SCREEN=0
$ CREATE /TERMINAL /DETACH

Pokud si spustím jako druhý X server třeba Cygwin příkazem

startx -- :1 -clipboard

bude nutné použít /SERVER=1

Náasledující část skriptu LOGIN.COM zajistí nastavení DISPLAY na stroj, ze kterého se hlásíte:

$ define /user sys$output tempshowprocess.txt
$ show process
$ pipe search /nostat tempshowprocess.txt "Host:" | -
  ( read sys$pipe p9 ; DEFINE /JOB P9 &P9)
$ DELETE tempshowprocess.txt;*
$ REMOTE_HOST = F$TRNLNM( "P9" )
$ REMOTE_HOST = f$extract(f$locate("(Host: ", REMOTE_HOST )+7, 99, REMOTE_HOST )
$ REMOTE_HOST = f$extract(0, f$locate(" ", REMOTE_HOST ), REMOTE_HOST )
$ DEASSIGN /JOB P9
$ WRITE SYS$OUTPUT "Opening terminal on the display ''REMOTE_HOST'"
$ set display /create /transport=tcpip /node="''REMOTE_HOST'" /server=0 /screen=0
$ create /terminal /detach

===Procedury a funkce===

DCL má dvě metody definování příkazových procedur; primitivnější používá
příkaz GOSUB návěští. Řízení se přenese na řádek

 $návěští:

a pokračuje až do provedení příkazu RETURN. Při této metodě nelze používat
parametry, takže hodnoty do a z příkazové procedury je nutné přenášet pomocí
symbolů.

Při druhé metodě se příkazová procedura definuje pomocí dvojice příkazů
SUBROUTINE a ENDSUBROUTINE:

<source lang="cobol">
$návěští: SUBROUTINE

$ EXIT
$ ENDSUBROUTINE

přičemž pro návrat z příkazové procedury se používá příkaz EXIT. Pro volání se používá příkaz

CALL návěští [parametr [parametr ...] ]

na parametry se uvnitř procedury odkazuje pomocí symbolů P1, P2, ... P9.

Čtení souboru ve skriptu

$ OPEN /READ 1 jméno_souboru
$10:
$ READ /END=99 1 proměnná
$! Zpracování obsahu řádku uložené v proměnné proměnná
$ GOTO 10
$99:
$ CLOSE 1

Příkaz SHOW SYSTEM

Příkaz SHOW SYSTEM vypíše aktuální seznam procesů a podprocesů. S parametrem /SUBPROCESS vypíše pouze podprocesy, s parametrem /NOSUBPROCESS naopak poprocesy vynechá. S parametry /BATCH, /INTERACTIVE, resp. /NETWORK vypíše pouze dávkové, interaktivní, resp. síťové procesy.

Parametr /OUTPUT=soubor zajistí přesměrování výstupu do souboru, /NOOUTPUT potlačí výstup úplně.

Zdá se, že na rozdíl od Unixu, který spouští programy pomocí fork a následným exec, ve VMS se používá pouze exec. Díky tomu po STOP /ID=číslo dojde k zavření terminálu používaného příslušným programem, nikoli k návratu do příkazového řádku. Podproces lze vytvořit příkazem SPAWN a ukončit (???) normálním LOGOUT.

Spuštění DCL skriptu, aby neskončil při odhlášení

RUN /DETACHED SYS$SYSTEM:LOGINOUT.EXE /INPUT=soubor.COM

V souboru SYS$COMMON:[SYSEXE]SYSUAF.DAT jsou informace o právech uživatelů. Kdo má k tomuto souboru práva, může po spuštění RUN AUTHORIZE zobrazit tato práva příkazem SHOW jméno_uživatele. zpracovává

MC AUTHORISE
AUF> SHOW uživatel

vypíše práva uživatele jeho ID apod.

WRITE SYS$OUTPUT "OpenVMS F$GETSYI("VERSION")' F$GETSYI("NODENAME")'   F$GETSYI("HW_NAME")'"
F$GETSYI("VERSION")    vrací verzi systému
F$GETSYI("NODENAME")   vrací jméno nodu
F$GETSYI("HW_NAME")    vrací typ počítače
F$GETSYI("ARCH_NAME")  vrací architekturu procesoru (Alpha, pro Itanium IA64)


Joby

Viz http://h71000.www7.hp.com/doc/82final/dcps_mg/dcpsnnn_mguide_005.html

Výpis front úloh (job queues) a úloh (jobs); vlastních, s parametrem /ALL všech uživatelů a včetně úloh ve frontách:

SHOW QUEUE
SHOW QUEUE /ALL [/FULL]

Fronty se dělí na

- dávkové BATCH - tiskové PRINTER - terminálové TERMINAL - serverové SERVER

Nezávisle na tom mohou být fronty generické - GENERIC

Vypsání pouze dávkových front:

SHOW QUEUE /BATCH

Typicky existují fronty <node>$SYSTARTUP a <node>_BATCH.

Restart fronty SYSTARTUP

STOP /QUEUE/RESET <node>$SYSTARTUP:
START/QUEUE <node>$SYSTARTUP:
ENABLE AUTOSTART/QUEUES/ON_NODE=<node>::

Výpis Queue Managera:

SHOW QUEUE /MANAGERS [/FULL]

Spuštění skriptu jako úlohy:

SUBMIT soubor[.COM] [ /AFTER=<čas> ] [ /LOG_FILE[=<filename>] ]

/AFTER zajistí odložené spuštění; Formáty pro <čas> popisuje HELP DCL_Tips Date_Time. Pro opakované spuštění je třeba na konci skriptu udělat nový SUBMIT.

SUBMIT /LOG=USER_DISK:[TCPDUMPS]DUMPUJ_NODE1.LOG /KEEP/NOPRINT/QUEUE=node_QUEUE -
  USER_DISK:[TCPDUMPS]DUMPUJ_NODE1.COM
DELETE /ENTRY <entry_number>

Nastavení stavu úlohy:

SET /ENTRY <entry_number> { /HOLD | /NOHOLD | /RELEASE }

/HOLD - odloží na neurčito /NOHOLD - zruší odložení, pokud bylo naplánováno na čas, který už je (byl),

          hned se pustí

/REALESE - pustí se hned

Změna organizace souboru

Pro nastavení správné organizace .*BCK souboru stačí:

SET FILE /ATTRIB=(RFM:FIX,RAT:NONE,LRL:32256) soubor.BCK
BACKUP soubor.BCK /SAV kam !RESTORE

Následující příkaz načte informace o organizaci zadaného souboru do souboru organizace.FDL:

ANALYZE/RMS_FILE/FDL/OUTPUT=organizace soubor

Soubor organizace.FDL lze vypsat příkazem TYPE a editovat příkazem

EDIT /FDL organizace.FDL

Po chvíli se objeví menu, ze kterého je třeba vybrat Modify zadáním M (lze používat celé položky menu nebo jejich jednoznačné zkratky). Objeví se nabídka, jaké primární atributy lze modifikovat, po výběru jednoho z nich jaké sekundární. Po výběru atributu a zadání jeho nové hodnoty lze zadat Ctrl-Z a pak exit.

Vytvoření nového souboru se zadanou organizací z původního souboru se provede příkazem

CONVERT/FDL=organizace.FDL soubor výstup