Digital Command Language

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

DCLDigital Command Language je příkazový a skriptovací jazyk používaný na většině operačních systémů vyvinutých firmou Digital Equipment Corporation (firma byla v roce 1998 převzata firmou Compaq, která se v průběhu let 2002-2004 sloučila s 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.

Základní vlastnosti[editovat | editovat zdroj]

DCL lze používat jak pro interaktivní práci, tak pro psaní příkazových skriptů. DCL rozeznává několik datových typů: řetězce, celá čísla, bitová pole, pole a logické hodnoty. Neumí pracovat s čísly v pohyblivé řádové čárce. Funkce operačního systému OpenVMS zpřístupňuje pomocí lexikálních funkcí, které se chovají stejně jako v kompilovaných programovacích jazycích. DCL umí pracovat s různými typy souborů systému RMS – stream, indexovaný a sekvenční soubor. DCL obsahuje řídicí konstrukci IF-THEN-ELSE, ale neobsahuje příkazy cyklu, které se musí naprogramovat pomocí příkazu GOTO.

V dokumentaci jsou obvykle příkazy a parametry psány velkými písmeny, ale DCL malá a velká písmena nerozlišuje. Příkazový řádek začíná jménem příkazu. Implementace DCL v OpenVMS umožňuje, aby příkazy byly zkráceny na libovolnou délku pokud je možné je vzájemně odlišit, jiné implementace DCL (např. v RSX-11) vyžadují aspoň první tři znaky jména příkazu. Místo příkazu DIRECTORY je možné psát DIR, DIRE, DIREC, atd.

Pro modifikaci nebo upřesnění, jak se má příkaz provést se používají tzv. kvalifikátory /SLOVO, které není nutné oddělovat mezerou od jména příkazu a jiných parametrů. Na pořadí kvalifikátorů a parametrů většinou nezáleží. 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) soubor1 soubor2

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).

Knihovna CLI pro zpracování příkazových řádků může být připojena i ke kompilovaným programům, což dodává prostředí systému konzistentní vzhled a chování.

Výzva DCL v interaktivním režimu je znak $ (lze změnit příkazem SET PROMPT = "řetězec").

Skript LOGIN.COM[editovat | editovat zdroj]

Při přihlášení uživatele k systému OpenVMS se provede příkazový skript LOGIN.COM v uživatelově domovském adresáři. Tento skript je možné použít pro nastavení symbolů a logických jmen. Pro obsah skriptu platí standardní pravidla pro příkazové skripty v OpenVMS (mj. každý příkazový řádek musí začínat znakem dolar).

Příkaz HELP[editovat | editovat zdroj]

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:

 HELP SEARCH
 HELP SEARCH /EXACT

S parametrem /MESSAGE vypisuje HELP nápovědu k názvům chyb:

 HELP /MESSAGE ACCVIO
 HELP /MESSAGE %SYSTEM-F-ACCVIO

Je také možné vypsat nápovědu k číslu chyby (v prvním příkazu je zadáno číslo signálu v desítkové soustavě, ve druhém v šestnáctkové):

 HELP /MESSAGE /STATUS=98954
 HELP /MESSAGE /STATUS=%x1828A

Příkazy OpenVMS[editovat | editovat zdroj]

Následující tabulka shrnuje nejužitečnější příkazy OpenVMS:

Příkaz Význam
TYPE soubor vypíše soubor na obrazovku
TYPE/PAGE soubor vypisuje soubor na obrazovku po obrazovkách; ukončení klávesou Q
TYPE /PAGE NLA0: smaže obrazovku
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é)
COPY co kam zkopíruje soubor nebo soubory, kam je povinné (použít např. *.*)
RENAME co kam přejmenuje nebo přemístí soubor nebo soubory
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, pomocí Ctrl-B nebo 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 obsahu adresáře
DIR/SIZE totéž včetně velikostí souborů v blocích
DIR/SIZE=(UNITS=BYTES) výpis obsahu adresáře s velikostmi souborů v bytech (KB, MB); SET PROCESS /UNITS=BYTES zapne tento výpis bez nutnosti psát parametr v příkazu DIR
DIR/PROT výpis adresáře s právy
DIR/OWNER výpis adresáře s vlastníkem souborů
SEARCH soubor text hledá zadaný text v souboru nebo souborech vyhovujících zadání (lze používat žolíky i ... pro prohledání podstromu
SEARCH soubor t1,t2 /MA=AND/WIN=10 hledá řádky obsahující řetězce t1 a t2, vypíše okolních 10 řádků
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
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á zadaný č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=(volby) vstup výstup třídění řádků souboru
DEFRAG SHOW /VOLUME DSA0: vypíše stav fragmentace souborů na disku DSA0: (vyžaduje práva k souboru INDEXF.SYS)

Lze používat žolíky (* libovolná posloupnost znaků, % libovolný znak; za hvězdičkou může následovat další část jména; použít *.*; pro poslední verzi všech souborů, resp. *.*;* pro všechny verze všech souborů).

Převod OpenVMS konstrukcí do Unixu:

Příkaz BACKUP[editovat | editovat zdroj]

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

Výpis obsahu *.BCK souboru:

 BACKUP subor.BCK /SAV /LIST

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

 BACKUP /IGNORE=INTERLOCK soubor;verze kam

Pokud má *.BCK soubor nastavenou špatnou organizaci souboru, při pokusu o jeho zpracování vypisuje systém chybu NOTSAVESET. Organizaci souboru lze opravit příkazem:

 SET FILE /ATTRIB=(RFM:FIX,RAT:NONE,LRL:32256) soubor.BCK

Příkaz ZIP[editovat | editovat zdroj]

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" (parametr musí být v apostrofech, jinak ho systém vezme jako malé -v):

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

Starší verze programu ZIP neumí pracovat s adresářovými stromy.

Příkaz MC DFU[editovat | editovat zdroj]

Příkaz DFU nebo MC DFU zpřístupňuje diskové a souborové utility, které zahrnují prohledávání a mazání adresářových stromů, obnovování smazaných souborů, změnu atributů souborů, hledání a obnovování adresářů, hledání souborových aliasů, kontrolu míry fragmentace a defragmentaci souborů, analýzu a opravu struktury systému souborů a analýzu, defragmentaci, zkrácení nebo prodloužení souboru INDEXF.SYS.

Příkaz SORT[editovat | editovat zdroj]

Pro setřídění řádků v souboru slouží příkaz SORT:

SORT /KEY=(volby) vstup výstup

Parametr KEY má následující syntaxi: /KEY=(POS:<pozice>,SIZE:<delka>,{DECIMAL|CHARACTER},{ASCENDING|DESCENDING})

Jména souborů[editovat | editovat zdroj]

Podrobnější informace naleznete v článku 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 Unikódové 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].

Zápis Význam
[000000] kořenový adresář (MFD)
[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 OpenVMS 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. Při úpravě 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 zápisu jména souboru znamená ;0 nebo jenom středník poslední verzi souboru. Středník následovaný kladným číslem je zadaná verze souboru. Středník následovaný záporným číslem je (n+1)-ní poslední verze (;-1 je předposlední verze, ;-2 je předpředposlední). Středník následovaný hvězdičkou znamená všechny verze.

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".

Další nápověda:

Symboly a logická jména[editovat | editovat zdroj]

OpenVMS 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[editovat | editovat zdroj]

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í typ 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[editovat | editovat zdroj]

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")

I jména disků jsou definována pomocí logických jmen. Dokonce je možné do logického jména přiřadit jméno adresáře zakončené tečkou a toto logické jméno používat podobně jako jméno disku.

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[editovat | editovat zdroj]

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

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

Standardní vstupy a výstupy a jejich přesměrování[editovat | editovat zdroj]

Podobně jako v Unixu mnoho příkazů v OpenVMS používá standardní výstup pro výpis na obrazovku, standardní chybový výstup pro výpis chyb a standardní vstup pro vstup pro čtení. Zatímco v Unixu se pro tyto účely používají očíslované popisovače 0, 1 a 2, v OpenVMS se používají následující logická jména:

Jméno Význam
SYS$OUTPUT standardní výstup
SYS$ERROR standardní chybový výstup
SYS$INPUT standardní vstup
SYS$COMMAND vstup z klávesnice

Předefinováním jednoho nebo více těchto logických jmen lze příslušný vstup nebo výstup přesměrovat. Například pro uložení výpisu příkazu DIR do soubor souboru VYPIS.TXT lze použít:

 DEFINE/USER SYS$OUTPUT VYPIS.TXT
 DIR/SIZE/DATE

Novější systémy mají pro přiblížení k unixovému zápisu příkaz PIPE, pomocí kterého lze uvedené dva příkazy zkrátit na:

 PIPE DIR/SIZE/DATE > VYPIS.TXT

Pokud se SYS$OUTPUT a/nebo SYS$ERROR přesměruje na NLA0: nebude se výstup vypisovat ani ukládat do souboru (NLA0: funguje jako unixové /dev/null).

Unixovému příkazu

 myprog < input.dat > a.lis

odpovídá v OpenVMS

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

Následující příklad ukazuje, jak napodobit unixové kolony (v koloně ale běží všechny příkazy současně):

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 s použitím příkazu PIPE)

 PIPE prog1 | prog2 | prog3

Naopak, některým příkazům, které vyžadují uvedení jména souboru, lze dodat jako parametr jedno ze jmen standardních vstupů nebo výstupů – příkladem je už výše uvedení SYS$OUTPUT u příkaz WRITE:

 WRITE SYS$OUTPUT "Text"

nebo použití SYS$INPUT při filtrování výstupu jiného příkazu pomocí SEARCH (unixový příkaz grep prohledává standardní vstup automaticky, pokud je zavolán s jedním parametrem):

 PIPE příkaz | SEARCH SYS$INPUT vzorek

Symbol SYS$INPUT lze použít místo unixových here-dokumentů:

 $ 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.

Psaní skriptů v DCL[editovat | editovat zdroj]

DCL umožňuje vytváření příkazových souborů. Mají příponu .COM a spouštějí se @jméno. Příkazy v příkazových skriptech musí začínat znakem $ (na první pozici). 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ů $!.

Aby se příkazy nevypisovaly před provedením, je nutné použít SET NOVERIFY. Příkaz SET NOON zajistí, že skript se nezastaví na první chybě při provádění (např. neexistující soubor).

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.

Příkazové konstrukce[editovat | editovat zdroj]

Základní příkazovou konstrukcí v DCL je podmíněný příkaz, který má dvě formy. Kratší obsahuje slovo THEN následované příkazem na stejném příkazovém řádku jako IF s podmínkou a neobsahuje ENDIF:

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

Pokud je THEN na zvláštním řádku, musí být celá konstrukce ukončena řádkem ENDIF:

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

Relační operátory[editovat | editovat zdroj]

Pro porovnání čísel je možné používat následující operátory:

Operátor Význam
.EQ. je rovno
.NE. není rovno
.LT. je menší než
.GT. je větší než
.LE. je menší nebo rovno
.GE. je větší nebo rovno

Pro porovnávání řetězců:

Operátor Význam
.EQS. je rovno
.NES. není rovno

Příkaz GOTO[editovat | editovat zdroj]

Pro vytváření cyklů a dalších příkazových konstrukcí je nutné používat příkaz GOTO – viz následující kapitola. Za příkazem GOTO je číslo návěští. Po provedení příkazu GOTO se vykonávání skriptu přenese na řádek začínající znakem $, za kterým je číslo návěští následované znakem dvojtečka. Ve skriptu nesmí být dvě stejná návěští.

Čtení souboru ve skriptu[editovat | editovat zdroj]

Následující fragment kódu slouží ke čtení souboru po jednotlivých řádcích. Příkaz OPEN otevře soubor se zadaným jménem pro čtení. Číslo 1 v příkazech OPEN, READ a CLOSE je popisovač souboru. Příkaz READ přečte jeden řádek ze souboru s popisovačem 1 do zadané proměnné. Pokud není možné přečíst další řádek souboru, protože už byl předchozím příkazem READ načten poslední, provede se skok na návěští zadané jako hodnota kvalifikátoru /END. Podobně je možné zadat návěští, kam se provede skok při chybě čtení ze souboru pomocí kvalifikátoru /ERROR.

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

Příkaz CLOSE soubor zavře.

Procedury a funkce[editovat | editovat zdroj]

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:

$návěští: SUBROUTINE
$! Příkazy funkce
$ 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.

Lexikální funkce[editovat | editovat zdroj]

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:

lexikální funkce Význam
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("řetězec") 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]) vrátí identifikaci a status systému
F$EDIT(řetězec, edit-list) vrátí upravený řetězec

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

Akce Význam Obdoba v Unixu
COLLAPSE Odstraní všechny mezery a tabelátory tr -d '[:space:]'
sed -e 's/[ \t]//g'
COMPRESS Nahradí posloupnosti mezer a tabelátorů jednou mezerou tr -s '[:space:]'
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í, další možnosti jsou NETWORK a OTHER.

Operace a funkce pracující s řetězci[editovat | editovat zdroj]

Výraz řetězec1 + řetězec2 vrátí řetězec, který vznikne spojením (zřetězením) řetězců řetězec1 a řetězec2.

Výraz řetězec - podřetězec vrátí řetězec, z něhož je vypuštěn zadaný podřetězec.

Funkce F$STRING(výraz) převede výraz na řetězec.

Funkce F$LENGTH(řetězec) vrací délku řetězce.

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:

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

Následující příkaz 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ž používání konstanty 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ů.

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

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ů:

Parametr Význam
PRCNAM Jméno procesu
IMAGNAME Jméno souboru (*.EXE), v němž je prováděná image
DFWSCNT Implicitní velikost working set
WSAUTH Maximální autorizovaná velikost working set
WSAUTHEXT Maximální autorizovaný working set extent
WSEXTENT Aktuální working set extent
WSPEAK Špičková velikost working set
WSQUOTA Kvóta velikosti working set
WSSIZE Limit aktuálního velikosti working set procesu
GPGCNT Globální počet stránek ve working set
PPGCNT Počet stránek procesu
VIRTPEAK Špičková velikost virtuálního adresního prostoru
PGFLQUOTA Maximální počet virtuálních stránek (kvóta stránkovacího souboru)
PAGFILCNT Zbývající kvóta stránkovacího souboru
PAGEFLTS Počet výpadků stránky

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, ...) slouží pro formátovaný výpis a funguje podobně jako printf v jazyce C. Formátovací direktivy:

Direktiva Význam
 !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:

Formát Význam
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[editovat | editovat zdroj]

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

Zjišťování existence souboru[editovat | editovat zdroj]

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

Zjišťování existence adresáře[editovat | editovat zdroj]

$ DEFINE /USER SYS$OUTPUT NLA0:
$ DEFINE /USER SYS$ERROR NLA0:
$ DIR [.ADRES]ABC.TXT
$ IF $STATUS = "%X1001C04A"
$ THEN
$   WRITE SYS$OUTPUT "Adresar [.ADRES] 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.

Změna organizace souboru[editovat | editovat zdroj]

Související informace naleznete také v článku Record Management Services.

OpenVMS na rozdíl od Unixových systémů, MS-DOSu a MS-Windows podporuje různé formáty souborů na úrovni systému souborů podobně jako tomu bylo u operačních systémů sálových počítačů v 60. letech 20. století. O zpracování různých formátů souborů se stará vrstva operačního systému nazývaná Record Management Services (RMS). RMS podporuje čtyři přístupové metody k záznamům: sekvenční přístup, přístup podle relativního čísla záznamu, přístup podle adresy záznamu v souboru a indexovaný přístup, a několik formátů záznamů: záznamy pevné délky, záznamy proměnné délky, záznamy proměnné délky s řídicími bloky pevné délky a proudové soubory (záznamy oddělené ukončovacími znaky).

Pokud organizace souboru na disku nesouhlasí s organizací uvedenou v metadatech souboru (když byl například soubor přenesen ze systému, který různé organizace souborů nepodporuje), je možné informace v metadatech upravit:

 SET FILE /ATTRIB=(...)

Hodnoty atributů jsou popsány v tabulce na stránce File Definition Language. Nastavení správné organizace souboru *.BCK je popsáno v části věnované příkazu BACKUP.

Pokud jsou metadata popisující organizaci souboru správná, a je potřeba vytvořit soubor se stejným obsahem, ale jinou organizací, je pro konverzi nutný popis organizace souboru v jazyce File Definition Language. Soubor pak lze zkonvertovat příkazem:

 CONVERT/FDL=organizace.FDL soubor výstup

Nebo lze vytvořit nový soubor s požadovanou organizací příkazem

 CREATE/FDL=organizace.FDL nový_soubor

Soubor *.FDL s popisem požadované organizace výstupního souboru lze získat dvěma způsoby:

  • Z existujícího souboru s požadovanou organizací pomocí příkazu ANALYZE/RMS_FILE/FDL
  • Pomocí editoru FDL souborů – příkazem EDIT /FDL

Další možností je vytvořit FDL soubor obyčejným textovým editorem.

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. Podrobnosti jsou na stránce File Definition Language.

Definice příkazů[editovat | editovat zdroj]

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

Pro spuštění skriptu (*.COM) je nutné použít příkaz DO:

 DO USER_DISK:[DIRECTORY.SUBDIR]JMENO

Místo DO je možné použít @:

 @USER_DISK:[DIRECTORY.SUBDIR]JMENO

Podobně pro binární programy (mají příponu .EXE) je nutné použít příkaz RUN:

 RUN USER_DISK:[DIRECTORY.SUBDIR]JMENO

Místo RUN je možné použít $:

 $USER_DISK:[DIRECTORY.SUBDIR]JMENO

Tento způsob spouštění programů a skriptů je těžkopádný a neumožňuje používání parametrů. Lepší způsob je popsán dále.

V novějších verzích OpenVMS používá DCL logické jméno DCL$PATH podobným způsobem jako Unix, MS-DOS nebo MS-Windows proměnnou prostředí PATH – jako seznam jmen adresářů, ve kterých se mají hledat programy (*.EXE a *.COM soubory). DCL$PATH může obsahovat více jmen adresářů oddělených čárkami.

 DIR DCL$PATH:jmeno.*

Standardní způsob definice příkazů je ale použití CLD (Command Language Definition) definic nebo symbolů – tzv. 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. Není známo, zda a jak se tyto informace vypisují.

Foreign commands se definují jako symboly:

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

Další informace viz

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 == "$TOOLS:UNZIP"
 $ ENDIF

Nastavování displeje v X[editovat | editovat zdroj]

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 se spustí jako druhý X server třeba Cygwin příkazem

startx -- :1 -clipboard

bude nutné použít /SERVER=1

Následující část skriptu LOGIN.COM zajistí nastavení DISPLAY na stroj, ze kterého se uživatel hlásí protokolem telnet (pro ssh není potřeba):

$ 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, F$LENGTH(REMOTE_HOST), 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

Příkaz SHOW SYSTEM[editovat | editovat zdroj]

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ě.

Zatímco Unix spouští programy pomocí fork a následným exec, v OpenVMS 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")'"
Funkce Význam
F$GETSYI("VERSION") vrátí verzi systému
F$GETSYI("NODENAME") vrátí jméno nodu
F$GETSYI("HW_NAME") vrátí typ počítače
F$GETSYI("ARCH_NAME") vrátí architekturu procesoru (Alpha, pro Itanium IA64)

E-mailový klient[editovat | editovat zdroj]

 MAIL

MAIL je e-mailový klient – používá nápovědu 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.

Dávkové úlohy (joby)[editovat | editovat zdroj]

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

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>] ]

Parametr /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> <akce>

Kde akce může být

Akce Význam
/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

Literatura[editovat | editovat zdroj]

  • Paul C. Anagnostopoulos, Steve Hoffman: Writing Real Programs in DCL, Second Edition, 1998, Digital Press. ISBN 1-55558-191-9

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]