POSIX-Kommandos aus BS2000 heraus aufrufen
Anwendungsbereich: | PROCEDURE |
Privilegierung: | STD-PROCESSING |
Mit dem BS2000-Kommando EXECUTE-POSIX-CMD wurde eine Möglichkeit geschaffen, Kommandos der POSIX-Shell aus dem BS2000 aufzurufen. Dies bedeutet, dass die Shell zur Kommando-Ausführung nicht mehr explizit aufgerufen werden muss, und man einzelne Kommandos, ganze Kommando-Sequenzen oder Shell-Skripts im BS2000 starten kann.
So kann man EXECUTE-POSIX-CMD beispielsweise dazu nutzen, vor einem Kopiervorgang mit COPY-POSIX-FILE in POSIX Verzeichnisse einzurichten oder nach einem Kopiervorgang die kopierten Dateien weiter zu bearbeiten.
Kenntnisse in der Syntax von Shell-Kommandos werden bei der Benutzung von EXECUTE-POSIX-CMD vorausgesetzt.
Die Kommandos bzw. Kommandosequenzen können entweder explizit eingegeben oder aus einer BS2000-Datei gelesen und ausgeführt werden. Bei der expliziten Eingabe mehrerer Kommandos/Kommandosequenzen werden diese als einzelne Listenelemente - getrennt durch Komma - eingegeben. Es wird allerdings keine separate Prüfung durchgeführt, jedes Listenelement wird so wie es ist an die Shell weitergereicht.
Bei der Eingabe über eine BS2000-Datei ergibt sich die Möglichkeit, Kommandos und Shell-Skripts nach vorherigem Kopieren in das BS2000 zu starten. Eine Parametrisierung ist dabei allerdings nicht möglich.
Die explizit oder implizit aufgerufenen Kommandos/Kommandosequenzen können bei der Ausführung von EXECUTE-POSIX-CMD in einer Log-Datei gespeichert werden. Da diese Datei eine BS2000-Datei ist, kann sie u. a. wiederum als Eingabedatei bei einem folgenden Aufruf von EXECUTE-POSIX-CMD genutzt werden. Soll z. B. eine umfangreiche Kommando-Sequenz mehrfach ausgeführt werden, kann man sich damit die erneute explizite Angabe ersparen.
Die Ausgaben des Kommandos werden entweder auf dem Bildschirm (SYSOUT) ausgegeben oder in eine BS2000-Datei geschrieben.
In der Shell, die vom Kommando EXECUTE-POSIX-CMD gestartet wird, ist folgende Umgebungsvariable gesetzt:
EXECUTE_POSIX_CMD="YES"
Durch Abfrage dieser Variablen, z.B. in /etc/profile oder .profile, können Ausgaben unterdrückt werden, die beim Kommando EXECUTE-POSIX-CMD nicht erwünscht sind.
Format
EXECUTE-POSIX-CMD Kurzname: ECXCMD | ||||||||||||||||||||
|
Operandenbeschreibung
CMD=
Angabe der auszuführenden Kommandos oder Skripts.
CMD = <filename 1..54>
Die Kommandos/Kommandoseqenzen werden aus einer BS2000-Datei gelesen.
CMD = list-poss (50): <c-string 1..1500 with-low>
Die Kommandos/Kommandoseqenzen werden explizit angegeben.
Wenn eine Liste von Zeichenketten angegeben wird, darf deren Gesamtlänge ca. 1500 nicht überschreiten, weil sonst der SDF-Fehler CMD0065 auftreten kann.
INPUT-LOG-FILE =
Angabe, ob eine Log-Datei geschrieben werden soll oder nicht.
INPUT-LOG-FILE =*NONE
Es wird keine Log-Datei geschrieben.
INPUT-LOG-FILE = <filename 1..54 without-generation-version>(...)
Angabe der BS2000-Datei, die als Log-Datei dienen soll.
WRITE-MODE = *REPLACE / *EXTEND
Angabe, ob die Log-Datei bei jedem Aufruf von EXECUTE-POSIX-CMD neu angelegt oder erweitert werden soll. Die Angabe von WRITE-MODE ist nur bei der Angabe einer BS2000-Datei relevant.
OUTPUT =
Angabe, wo die Ausgaben des Kommandos erfolgen sollen.
OUTPUT = *SYSOUT
Die Ausgaben des Kommandos werden auf dem Bildschirm angezeigt.
OUTPUT = <filename 1..54>
Die Ausgaben des Kommandos werden in eine BS2000-Datei geschrieben.
Einschränkungen
Kommandos/Skripts, die mit EXECUTE-POSIX-CMD ausgeführt werden, können nicht von der Standardeingabe lesen, da diese vor der Ausführung des Kommandos/Skripts geschlossen wird. Daher erhalten solche Kommandos/Skripts EOF, wenn sie versuchen, von der Standardeingabe zu lesen.
POSIX-Kommandos, die unter Umständen von der Standardeingabe lesen, sind:
rm
Rückfrage beim Löschen schreibgeschützter Dateien, wenn die Option -f nicht angegeben wurde; EOF beim Lesen von stdin wird wie ja behandelt, d. h. die Datei wird gelöscht.
mv
Rückfrage beim Überschreiben schreibgeschützter Dateien, wenn die Option -f nicht angegeben wurde; die Datei wird nicht überschrieben und ein Fehler generiert.
bs2cp
Rückfrage beim Überschreiben von BS2000-Dateien, wenn die Option -f nicht angeben wurde; EOF beim Lesen von stdin wird wie nein behandelt, d. h. die BS2000-Datei wird nicht überschrieben.
mailx
Eingaben an mailx sind nicht möglich, d. h. lediglich die Abfrage, ob Nachrichten vorhanden sind, ist sinnvol einsetzbar.
Bei EXECUTE-POSIX-CMD sind stdout und stderr nicht mit einem Terminal verbunden, sondern mit einer Pipe. Kommandos/Skripts, die voraussetzen, dass stdout und stderr mit einem Terminal verbunden sind, arbeiten daher nicht oder nicht korrekt. Diese Kommandos/Skripts verwenden die CRTE-Funktionen isatty() bzw. ttyname(), um zu ermitteln, ob oder mit welchem Terminal stdout und stderr verbunden sind.
POSIX-Kommandos, die deswegen unter Umständen nicht oder nicht korrekt funktionieren, sind:
tty
Liefert not a tty mit Endestatus 1 anstatt /dev/term/nnnn.
tabs
Funktioniert an Blockterminals generell nicht.
mesg, write, talk
Diese Kommandos zum Austausch von Nachrichten zwischen Terminals funktionieren an Blockterminals nur rudimentär und unter EXECUTE-POSIX-CMD praktisch gar nicht.
more
Das Kommando more verhält sich unter EXECUTE-POSIX-CMD wie das Kommando cat.
patch
Bei Rückfragen wird eine leere Antwort generiert, was zu Endlosschleifen führen kann.
pax
Der interaktive Modus (Option -i) ist nicht möglich.
nohup
Das Kommando nohup funktioniert nicht, weil stdout kein Terminal ist.
ls
Das Kommando ls gibt die Dateien nur in mehreren Spalten aus, wenn dies explizit durch ls -C gefordert wird.
fg
Liefert No Job Control.
bg
Liefert No Job Control.
Wird das Shell-Kommando exec mit EXECUTE-POSIX-CMD ausgeführt, so wird die aktuelle Shell entladen, und die Mechanismen zum Weiterleiten von Ausgaben und/oder des Exit-Wertes von geforkten Prozessen können möglicherweise außer Kraft gesetzt werden.
Beispiel
/begin-block %BEGIN-BLOCK/ecxcmd ('exec who am i') %BEGIN-BLOCK/if-cmd-error %IF-CMD-ERROR/wrtx 'cmd 1 failed' %IF-CMD-ERROR/else %ELSE/wrtx 'cmd 1 ok' %ELSE/end-if %BEGIN-BLOCK/ecxcmd ('exec who ar u') %BEGIN-BLOCK/if-cmd-error %IF-CMD-ERROR/wrtx 'cmd 2 failed' %IF-CMD-ERROR/else %ELSE/wrtx 'cmd 2 ok' %ELSE/end-if %BEGIN-BLOCK/end-block FROEDE sf/002 Nov 12 09:07 cmd 1 ok who: Syntax: who [-mu] -s [-bHlprt] [datei] who [-mTu] [-abdHlprt] [datei] who -q [-n #] [datei] who [am i|am I] cmd 2 ok /
Das Kommando fc wirkt nur auf Eingaben außerhalb von Skripts, es ist deshalb unter /EXECUTE-POSIX-CMD ungeeignet.
Die mit EXECUTE-POSIX-CMD ausgeführten Shell-Kommandos werden nicht in das übliche Kommandogedächtnis ($HOME/.sh_history) protokolliert, sondern in ein separates relativ kurzes (HISTSIZE=100) Kommandogedächtnis unter
/tmp/.ecxcmd_sh_history_<user-name>.Kommandosubstitutionen durch ’kommando’ oder $(kommando) werden unter EXECUTE-POSIX-CMD generell in einer Sub-Shell ausgeführt. In der POSIX-Shell dagegen gibt es eine Reihe von Kommandos, die innerhalb der Shell selbst substituiert werden.
Das hat zur Folge, dass einzelne Kommandos sich anders verhalten können als in der POSIX-Shell, sofern die Ergebnisse prozess-spezifisch sind. Bekannte Fälle dazu sind ftyp und bs2file sowie Zugriffe auf nicht exportierte Variablen oder Funktionen.
Alias-Namen:
Die von EXECUTE-POSIX-CMD auszuführende Kommandosequenz wird in der POSIX-Shell mit dem Punkt-Kommando ausgeführt. Deshalb steht das Kommando alias zum Definieren von Alias-Namen zwar zur Verfügung, hat aber innerhalb der Kommandosequenz keine Wirkung bei der Kommandoausführung. Sollen in einer Kommandosequenz Alias-Namen definiert und verwendet werden, muss die Kommandosequenz in eine (temporäre) POSIX-Datei kopiert werden. Diese muss das Execute-Recht bekommen und ausgeführt werden (nicht mit Punkt-Kommando).Folgende Wege sind sinnvoll:
Die Kommandosequenz wird als BS2000-Datei erstellt und mit COPY-POSIX-FILE in eine temporäre POSIX-Datei kopiert. Danach wird sie ausgeführt.
Beispiel
/EXEC-POSIX-CMD CMD=(’chmod +x scriptfile’, ’scriptfile’, ’rm -f
scriptfile’)
Die Kommandosequenz generiert selbst eine temporäre Skript-Datei in POSIX aus einem so genannten Here-Dokument und führt sie aus.
Beispiel
cat <<***END_OF_SCRIPT >/tmp/my_scriptfile_$$ kommando1 kommando2 ... ***END_OF_SCRIPT /tmp/my_scriptfile_$$ rm -f /tmp/my_scriptfile_$$
EXECUTE-POSIX-CMD beendet sich erst, wenn alle aus der Kommandosequenz gestarteten Hintergrundprozesse beendet sind. Auch mit dem Kommando nohup kann keine asynchrone Verarbeitung erzwungen werden.
Die mit EXECUTE-POSIX-CMD aufgerufene Kommando-Sequenz wird in einer Sub-Shell ausgeführt, die intern per fork erzeugt wird. In dieser Sub-Shell steht die SYSFILE-Umgebung der aufrufenden Prozedur nicht zur Verfügung. Das kann Auswirkungen haben auf BS2000-Kommandos, die mit bs2cmd aufgerufen werden, sowie auf die POSIX-Kommandos lp, lpstat und cancel.
Beispiel
/begin-block / ecxcmd 'bs2cmd sh-sys-file-ass \*syscmd' /end-block PROCEDURE LEVEL NUMBER 0 SYSCMD : (PRIMARY) /
vgl. aber:
/begin-block / start-posix-shell /end-block POSIX Basisshell ... *bs2cmd sh-sys-file-ass \*syscmd PROCEDURE LEVEL NUMBER 1 SYSCMD : *PRIMARY (DIALOG-BLOCK) *
Die Taste K2 muss zweimal gedrückt werden, um EXECUTE-POSIX-CMD abzubrechen.
Kommando-Returncode
(SC2) | SC1 | Maincode | Bedeutung |
0 | CMD0001 | Ohne Fehler | |
1 | CMD0202 | Fehler beim Aufruf der Prozedur ECXCMD (siehe Hinweis zum SDF-Fehler CMD0065 oben) | |
x | 64 | CCM0999 | Das Shell-Kommando, die Kommandosequenz bzw. das Skript liefert einen Exit-Status mit dem Wert x (ungleich 0), der dem SC2 entnommen werden kann |