Digital Command Language
Paradigma | imperativní |
---|---|
Autor | Digital Equipment Corporation[1] |
Vývojář | VMS Software Inc. (VSI)[2] |
Ovlivněn jazyky | BASIC |
Ovlivnil jazyky | PowerShell |
OS | RSTS/E, RSX-11, RT-11, OpenVMS, VAXELN, MICA |
Digital Command Language (DCL) je interpret příkazů a skriptovací jazyk používaný v mnoha operačních systémech firmy Digital Equipment Corporation. DCL má kořeny v systémech IAS, TOPS-20, a RT-11 a byl implementován jako standard ve většině operačních systémů firmy DEC, především RSX-11 a RSTS/E, ale nerozvinutější implementace pochází z VAX/VMS (později OpenVMS). Firma Digital Equipment Corporation byla v roce 1998 převzata firmou Compaq, která se v průběhu let 2002–2004 sloučila s firmou Hewlett-Packard, ale podpora některých systémů stále pokračuje. Po roce 2020 je DCL jako jedna ze součástí OpenVMS vyvíjen firmou VMS Software, Inc. (VSI).[3]
DCL je skriptovací jazyk, který vznikl v době, kdy se intenzivně používal programovací jazyk Fortran. Přesto DCL podporuje několik datových typů, včetně řetězců, celých čísel, bitových polí, polí a logických hodnot, nemá však podporu čísel s pohyblivou řádovou čárkou. Pro přístup k systémovým službám API jádra OpenVMS slouží lexikální funkce, které poskytují stejnou funkčnost jako jejich protějšky v kompilovaných jazycích a umožňují skriptům získat informace o stavu systému. DCL umožňuje používat podmíněný příkaz IF-THEN-ELSE, přístup k všem typům souborů, které podporují Record Management Services (RMS) včetně streamů, indexovaných, a sekvenčních souborů, ale nemá žádné konstrukce pro vytváření cyklů; cykly se musí programovat pomocí příkazů IF a GOTO.
Základní vlastnosti
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
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
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
Příkazy
K nejpoužívanějším příkazům DCL příkazů, které jsou dostupné v příkazovém řádku systému OpenVMS, patří:[2]
COPY, CREATE, DELETE, DIR, EDIT, LOGOUT, PRINT, RENAME, SET, SHOW, TYPE
Následující tabulka shrnuje nejužitečnější příkazy DCL s často užívanými parametry:
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 (minus 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 DEVICES [jméno] | vypíše stav zařízení |
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
Příkaz BACKUP slouží nejen k archivaci souborů nebo celých disků na pásky, ale umožňuje také vytvářet archivní soubory s příponou .BCK a kopírovat soubory.
Zkopírování celého podstromu:
BACKUP [ODKUD...] [KAM...]
Pokud se má kopírovat více souborů, oddělují se jejich jména čárkami. Alternativou je vytvořit soubor obsahující jména souborů, které se mají kopírovat (oddělená mezerami nebo konci řádků) a uvést jeho jméno následované parametrem /INPUT_FILES na místě parametru ODKUD. Pokud se má pracovat s archivem (tj. vytvářet archiv nebo číst archiv), je třeba za jeho jménem napsat parametr /SAVE_SET (stačí zkratka /SAV).
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ých souborů
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ři archivaci celého stromu adresářů (nebo vybraných souborů ve stromě adresářů) je možné používat na konci cesty tři tečky, které znamenají, že se mají procházet i vnořené adresáře. V tom případě BACKUP do archivů ukládá jména souborů s cestou, ale bez označení disku (resp. bez části před dvojtečkou). Pomocí parametru /SELECT lze vybírat jen některé soubory a pomocí parametru KAM předepisovat, kam se mají rozbalit. Pokud chceme předepsat, že rozbalovaný soubor má vytvořit nejnovější verzi souboru v archivu, je potřeba za jménem souboru napsat středník nebo tečku. Rozbalování vybraných souborů z archivu do oddělených poadaresářů pak může vypadat například takto:
BACKUP ARCHIV.BCK /SAV /SELECT=[FAKTURY...]2020*.* NOVY_DISK:[FAKTURY.2020...]*.*;
BACKUP ARCHIV.BCK /SAV /SELECT=[FAKTURY...]2021*.* NOVY_DISK:[FAKTURY.2021...]*.*;
Příkaz ZIP
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
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 SHOW DEVICES
Příkaz SHOW DEVICES (lze zkrátit na SH DEV) vypisuje informace o zařízeních. Jako parametr lze použít jméno zařízení nebo jeho začátek, takže např. SHOW DEV D vypíše informace o discích (u disků se vypisuje i jmenovka disku, počet volných bloků, počet transakcí a počet připojení disku). S parametrem /FULL vypisuje podrobnější informace, s parametrem /FILES vypisuje seznam otevřených souborů včetně jména a PID procesu, který soubor používá – podobně jako unixový příkaz lsof.
Příkaz SORT
Pro setřídění řádků souboru slouží příkaz SORT:
SORT /KEY=(volby) vstup výstup /NODUPLICATES
Jméno vstupního a výstupního souboru musí být vždy zadáno; pokud se má třídit výstup jiného příkazu je nutné použít
PIPE příkaz parametry | SORT SYS$INPUT SYS$OUTPUT
Nepovinný parametr KEY má následující syntaxi: /KEY=(POS:<pozice>,SIZE:<délka>,{DECIMAL|CHARACTER},{ASCENDING|DESCENDING}). Při použití parametru /NODUPLICATES budou odstraněny opakující se řádky.
Jména souborů
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".
DCL jako programovací jazyk
Digital Command Language lze používat jako programovací jazyk, který disponuje proměnných několika typů s rozlišováním lokálních a globálních proměnných, umožňuje emulovat pole a asociativní pole, umí vyhodnocovat aritmetické výrazy, má operátory a funkce pro práci s řetězci, disponuje jednoduchými řídícími konstrukcemi (podmíněný příkaz, GOTO, procedury/funkce s parametry), umožňuje číst a vytvářet textové soubory.
Symboly jako proměnné
Roli proměnných plní v DCL symboly. Jméno symbolu může oficiálně obsahovat velká písmena anglické abecedy, číslice, znaky podtržítko _
a dolar $
; nesmí začínat číslicí. Malá písmena se automaticky převádějí na velká. Neoficiálně se ve jménu symbolu mohou vyskytovat některé další znaky, jako složené závorky {
, }
, svislá čára |
, ampersand &
, zpětné lomítko \
, zpětný apostrof `
, vlnovka ~
. Jméno symbolu nemůže obsahovat mezeru; pro vytváření víceslovných jmen symbolů lze místo mezer používat znaky podtržítko. Operační systém používá místo mezery znak dolar – uživatel by neměl vytvářet jména obsahující znak dolar, aby nedošlo ke konfliktu se jmény používanými systémem.
Symboly se nijak nedeklarují, pro nastavení hodnoty symbolu se používá přiřazení:
jmeno = výraz
Výraz může být číselný a obsahovat číselné konstanty (jde o 32bitová čísla se znaménkem, tj. v rozsahu -2147483648 až 2147483647, zápis čísla v osmičkové soustavě má před číslicemi %0
, v šestnáctkové %x
nebo %X
[4]), operátory +
, -
, *
, a /
, jména symbolů (která se při vyhodnocování nahradí jejich hodnotami) a lexikální funkce; nebo řetězcový, který může obsahovat řetězcové konstanty uzavřené v uvozovkách, operátory +
a -
, jména symbolů a lexikální funkce. Pro přiřazení řetězce do symbolu lze použít také řetězcové přiřazení s :=
:
jmeno := řetězec
Řetězec v tomto případě nemusí být uzavřen v uvozovkách. Pak však budou malá písmena převedena na velká, úvodní a koncové mezery vypuštěny, ostatní posloupnosti mezer nahrazeny jednou mezerou a části textu uzavřené v jednoduchých apostrofech interpretovány jako vyhodnocení symbolů (nahrazeny hodnotou symbolu).
Lokální a globální symboly
Pomocí jednoduchého rovnítka se vytvářejí lokální symboly; globální symboly se vytvářejí pomocí dvojitého rovnítka:
jmeno == výraz
případně
jmeno :== řetězec
Lokální symboly zanikají při opuštění příkazové procedury (*.COM skriptu) nebo procedury definované pomocí SUBROUTINE
a volané pomocí CALL
, ve vnořených voláních příkazových procedur jsou však dostupné. Pokud existuje lokální i globální symbol téhož jména, je globální symbol lokálním překryt.
Typy hodnot
U hodnot symbolů se rozlišuje typ – například operátor +
pracuje s řetězci jinak než s čísly – jsou-li oba operandy řetězce, pak je spojí (zřetězí), je-li alespoň jeden číslo, pak je sečte. Podobně operátor -
pro dva řetězce vrátí první řetězec, z něhož byl vypuštěn druhý, zatímco je-li alespoň jeden z operandů číslo, provede odčítání. Proto výstup následující ho skriptu:
$ SAY = "WRITE SYS$OUTPUT"
$! Toto jsou řetězce:
$ STR1 = "123"
$ STR2 = "321"
$ STR3 = "123 ABC"
$! Funkce F$INTEGER převede řetězec na číslo:
$ NUM1 = F$INTEGER(STR1)
$! Toto je číslo:
$ NUM2 = 321
$! Pokud řetězec obsahuje, něco jiného než číslo, vrátí F$INTEGER nulu:
$ NUM3 = F$INTEGER(STR3)
$ SAY "STR1: ''STR1'"
$ SAY "STR2: ''STR2'"
$ SAY "STR3: ''STR3'"
$ SAY "NUM1: ''NUM1'"
$ SAY "NUM2: ''NUM2'"
$ SAY "NUM3: ''NUM3'"
$ SAY "STR1 + STR2: ", STR1 + STR2
$ SAY "STR1 + NUM2: ", STR1 + NUM2
$ SAY "NUM1 + STR2: ", NUM1 + STR2
$ SAY "NUM1 + NUM2: ", NUM1 + NUM2
$ SAY "NUM1 + STR3: ", NUM1 + STR3
$ SAY "STR3 - STR1: ", STR3 - STR1
$ SAY "STR3 - NUM1: ", STR3 - NUM1
$ SAY "Protoze:"
$ SHOW SYMBOL STR1
$ SHOW SYMBOL STR2
$ SHOW SYMBOL STR3
$ SHOW SYMBOL NUM1
$ SHOW SYMBOL NUM2
$ SHOW SYMBOL NUM3
je takovýto:
STR1: 123 STR2: 321 STR3: 123 ABC NUM1: 123 NUM2: 321 NUM3: 0 STR1 + STR2: 123321 STR1 + NUM2: 444 NUM1 + STR2: 444 NUM1 + NUM2: 444 NUM1 + STR3: 123 STR3 - STR1: ABC STR3 - NUM1: -123 Protoze: STR1 = "123" STR2 = "321" STR3 = "123 ABC" NUM1 = 123 Hex = 0000007B Octal = 00000000173 NUM2 = 321 Hex = 00000141 Octal = 00000000501 NUM3 = 0 Hex = 00000000 Octal = 00000000000
Použití hvězdičky pro umožnění zkracování jména symbolu
Pokud se použije znak hvězdička ve jméně symbolu na levé straně přiřazení, je možné jméno symbolu zkracovat – znaky za hvězdičkou se nemusí uvádět:
DNES*NI_DATUM = "5.12.2022"
WRITE SYS$OUTPUT DNE
%DCL-W-UNDSYM, undefined symbol - check validity and spelling
\DNE\
WRITE SYS$OUTPUT DNES
5.12.2022
WRITE SYS$OUTPUT DNESN
5.12.2022
WRITE SYS$OUTPUT DNESNI
5.12.2022
WRITE SYS$OUTPUT DNESNI_
5.12.2022
WRITE SYS$OUTPUT DNESNI_D
5.12.2022
WRITE SYS$OUTPUT DNESNI_DATUM
5.12.2022
WRITE SYS$OUTPUT DNESNI_DATUMY
%DCL-W-UNDSYM, undefined symbol - check validity and spelling
\DNESNI_DATUMY\
Symboly jako příkazové aliasy
Symboly také slouží jako příkazové aliasy – pokud se v příkazovém řádku na místě, kde může být jméno příkazu, objeví jméno symbolu, bude nahrazeno hodnotou symbolu. Například dlouhý příkaz WRITE SYS$OUTPUT
, který se používá pro výpis na obrazovku se často nahrazuje příkazem SAY
definovaným takto (uživatelé unixových systémů by příkaz pravděpodobně pojmenovali echo):
SAY = "WRITE SYS$OUTPUT"
Další příklady definování příkazových aliasů:
HOME == "SET DEFAULT SYS$LOGIN"
TP == "TYPE/PAGE"
DS == "DIRECTORY/SIZE"
SQ == "SHOW QUOTA"
LL == "DIR/SIZE/OWNER/PROT"
Výpis a rušení symbolů
Pro výpis 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)
Rušení symbolů:
DELETE /SYMBOL jméno
DELETE /SYMBOL/GLOBAL jméno
Pro zjištění, zda je symbol definován, lze použít lexikální 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
Vyhodnocování symbolů
Na rozdíl od unixových shellů, kde je nutné vyhodnocení symbolu vynutit použitím znaku dolar před jménem symbolu, DCL před provedením příkazu automaticky vyhodnotí symboly na následujících místech:[5]
- na začátku příkazu
- v lexikální funkci
- v příkazech
WRITE
neboIF
- na pravé straně přiřazovacího příkazu
=
nebo==
- uvnitř závorek na levé straně přiřazovacího příkazu, když se provádí substituce řetězce
Na ostatních místech je nutné vyhodnocení symbolu vynutit jeho zapsáním mezi apostrofy. Pokud se na výše uvedených místech uzavře jméno symbolu do apostrofů, vyvolá se další úroveň vyhodnocení, tj. bude se pracovat se symbolem, jehož jméno je hodnotou toho uvedené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 slouží jako odkazy na soubory, adresáře nebo disky. Definují se 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
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í
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
DCL umožňuje vytváření příkazových souborů nebo skriptů (doslova příkazových procedur, anglicky command procedure) z příkazů DCL. Příkazový soubor musí mít příponu .COM a spouští se @jméno (přípona .COM a číslo verze nemusí být uvedeny, má-li být spuštěn příkazový soubor z jiného než aktuálního adresáře, je třeba uvést cestu k souboru). 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ů $!. Dlouhé příkazové řádky lze rozdělit za jménem příkazu nebo některým z parametrů uvedením znaku mínus na konci řádku.
Fungování příkazových souborů lze ovlivnit příkazy
Funkce | Význam |
---|---|
SET VERIFY | bude vypisovat každý příkaz před provedením |
SET NOVERIFY | nebude vypisovat příkazy před provedením |
SET ON | ukončí skript při první chybě |
SET NOON | při chybě pokračuje v provádějí skriptu |
Při spuštění skriptu lze v příkazovém řádku zadat maximálně 8 parametrů, které jsou ve skriptu 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
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
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
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
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
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, ... P8.
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:
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$SEARCH("jméno") | vrací úplné jméno souboru i když zápis obsahuje logická jména; lze použít pro ověření, zda soubor existuje (pro neexistující soubor vrací prázdný řetězec) |
F$PARSE("soubor",,,"co") | vrátí požadovanou složku jména souboru, jméno souboru je vhodné získat funkcí F$SEARCH |
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 |
Parametr "co" funkce F$PARSE může mít následující hodnoty:
co | Význam |
---|---|
NODE | jméno uzlu v clusteru |
DEVICE | jméno zařízení (disku) s dvojtečkou na konci |
DIRECTORY | jméno adresáře |
NAME | jméno souboru bez přípony |
TYPE | přípona s tečkou na začátku |
VERSION | verze se středníkem na začátku |
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
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$EXTRACT(start, délka, řetězec) vrací podřetězec řetězce zadaného 3. parametrem začínající na pozici start (začátek řetězce je 0) o zadané délce
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:
- https://web.archive.org/web/20160304222204/http://www.djesys.com/freeware/vms/dclprog.ppt
- http://www.classiccmp.org/interex/conference/hpworld2004/presentations04/4038.pdf Archivováno 14. 10. 2019 na Wayback Machine. – kopie výše uvedeného 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ů:
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 |
!! | ! |
Příkaz
write sys$output F$FAO("|!#(#AS)|", 3, 20, "Nazev", "Zkratka", "Popis")
vypíše
|Nazev Zkratka Popis |
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 [.ADRES]ABC.TXT
$ IF $STATUS .EQS. "%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
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ů
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:
- http://www.answers.com/topic/digital-command-language
- https://web.archive.org/web/20120627115440/http://h71000.www7.hp.com/doc/82final/6100/6100pro.html
- http://www.encompassus.org/ftplib/VS0169_VMS94A_TK_KILL_AAAREADME_DOC.html[nedostupný zdroj]
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
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
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
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)
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.
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 |
Užitečné skripty
Reset terminálových fontů
Pokud omylem vypíšeme binární soubor na obrazovku, terminál nebo emulátor terminálu se může přepnout do režimu, kdy místo ASCII znaků vypisuje semigrafické znaky (rámečky apod.). Zpětné přepnutí terminálu zajistí spuštění následujícího skriptu, který vypíše řídicí znak Escape následovaným malým c
:
$! Reset terminal fonts after displaying binary file
$ ESC[0,8] = 27
$ WRITE SYS$OUTPUT "''ESC'c"
Nastavení velikosti okna v X11
První příkaz zapne na příkazovém řádku režim vkládání a nastaví délku řádku na 170 znaků a výšku okna na 50 textových řádků, další příkazy zajistí poslání escape sekvence, která v prostředí X11 nastaví velikost okna na hodnoty zadané v prvním příkazu:
$ SET TERM/INS/WI=170/PAG=50
$ ESC[0,8] = 27
$ SCREEN_WIDTH = F$GETDVI(F$TRNLNM("TT"),"DEVBUFSIZ")
$ SCREEN_HEIGHT = F$GETDVI(F$TRNLNM("TT"),"TT_PAGE")
$ WRITE SYS$OUTPUT "''ESC'[8;''SCREEN_HEIGHT';''SCREEN_WIDTH't"
Nastavení titulku okna
Následující skript nastaví titulek v rámu terminálového okna (a titulek u ikony) na řetězec zadaný jako parametr skriptu:
$ esc[0,8] = 27
$ brr[0,8] = 93
$ bsl[0,8] = 92
$
$ If f$trnlnm("DECW$DISPLAY") .eqs. "" Then Exit
$
$ win_title = " ''P1' "
$ if f$length(win_title) .gt. 64
$ Then
$ win_title = f$edit(win_title, "COMPRESS")
$ Endif
$ icn_title = " ''P1' "
$ ln1 = esc + brr + "21;" + win_title + esc + bsl
$ ln1 = ln1 + esc + brr + "2L;" + icn_title + esc + bsl
$ write sys$output ln1
$!
$ Exit
Odkazy
Reference
V tomto článku byl použit překlad textu z článku DIGITAL Command Language na anglické Wikipedii.
- ↑ VAX/VMS Software Language and Tools Handbook [online]. bitsavers.org, 1985 [cit. 2020-12-31]. Dostupné online.
- ↑ a b VSI OpenVMS User's Manual [online]. VSI, July 2020 [cit. 2021-01-27]. Dostupné online.
- ↑ Software Product Description and QuickSpecs - VSI OpenVMS Version 8.4-2L1 for Integrity servers [online]. VMS Software Inc., July 2019 [cit. 2021-01-02]. Dostupné online.
- ↑ VSI-VMS-USERS-MANUAL, 12.7.1 Specifying Numbers.
- ↑ Users Guide to VAX/VMS Part I of III
Literatura
- Paul C. Anagnostopoulos; Steve Hoffman, 1998. Writing Real Programs in DCL. 2. vyd. [s.l.]: Digital Press. ISBN 1-55558-191-9.
Související články
Externí odkazy
- HP OpenVMS DCL Dictionary
- VSI OpenVMS DCL Dictionary: A-M – přehled příkazů DCL
- VSI OpenVMS DCL Dictionary: N-Z – přehled příkazů DCL
- VMS Software, 2020. VSI OpenVMS User's Manual [online]. Bolton: VMS Software, Inc., červenec 2020. Dostupné online.
- OpenVMS.org's DCL archive
- Archive of DEC Professional/Digital Age magazine's DCL columns
- XML-based new orientation for DCL and OpenVMS interface
- IITS Helpline VMS Beginner's FAQ
- Users Guide to VAX/VMS Part I of III
- Users Guide to VAX/VMS Part II of III
- Users Guide to VAX/VMS Part III of III
- Nikita Evstigneev: Command Line Description Generator (Bachelor’s thesis)
Média použitá na této stránce
OpenVMS 8.4-2L1, showing the execution of DCL commands