POSIX-Kommandos aus dem BS2000 aufrufen
Komponente: | POSIX-BC |
Funktionsbereich: | POSIX verwalten und benutzen |
Anwendungsbereich: | PROCEDURE |
Privilegierung: | STD-PROCESSING |
Funktionsbeschreibung
Mit dem Kommando EXECUTE-POSIX-CMD kann der Benutzer POSIX-Kommandos direkt im BS2000 aufrufen ohne vorher explizit eine POSIX-Shell für die Ausführung aufzurufen. Der Benutzer kann ein einzelnes Kommando, eine Liste von Kommandos (Kommandosequenz) oder den Namen einer BS2000-Datei, die ein Skript enthält, angeben.
Der Benutzer muss die Voraussetzungen zum Aufruf einer POSIX-Shell erfüllen (siehe Kommando START-POSIX-SHELL).
Die angegebenen Kommandos werden ohne Syntaxprüfung an eine POSIX-Shell weitergereicht und mit dem Punkt-Kommando aufgerufen. In der Shell ist die Umgebungsvariable EXECUTE_POSIX_CMD="YES"
gesetzt. Durch Abfrage der Variablen (z.B. in der /etc/profile oder .profile) können Ausgaben unterdückt werden, die bei der Ausführung mit EXECUTE-POSIX-CMD nicht erwünscht sind.
Die Verarbeitung des Kommandos EXECUTE-POSIX-CMD endet erst, wenn alle übergebenen Kommandos abgearbeitet sind (d.h. alle gestarteten Hintergrundprozesse sind beendet). Die Verarbeitung kann mit zweimaligen Drücken der K2-Taste abgebrochen werden.
Optional lassen sich die angegebenen POSIX-Kommandos in eine BS2000-Datei protokollieren (Operand INPUT-LOG-FILE) und können bei Bedarf aus dieser Datei erneut aufgerufen werden.
Die Ausgaben des Kommandos erfolgen standardmäßig nach SYSOUT (Operand OUTPUT), können aber auch in eine Datei geschrieben werden.
Zulässige Eingaben (Umfang der unterstützten POSIX-Kommandos) und allgemeine Hinweise zur Arbeit mit der POSIX-Shell enthält das Handbuch „POSIX (Kommandos)“ [29].
Format
EXECUTE-POSIX-CMD | Kurzname: ECXCMD | ||||||||||||||||||||
|
Operandenbeschreibung
CMD=
Angabe der auszuführenden Kommandos oder Skripts.
CMD = <filename 1..54>
Name der BS2000-Datei, aus der die Kommandos/Kommandoseqenzen gelesen werden sollen.
CMD = list-poss (15): <c-string 1..100 with-low>
Das Kommando wird explizit angegeben. Mehrere Kommandos können innerhalb einer Liste als Kommandosequenz angegeben werden.
INPUT-LOG-FILE =
Gibt an, ob die Eingaben protokolliert werden sollen.
INPUT-LOG-FILE = *NONE
Die Eingaben werden nicht protokolliert.
INPUT-LOG-FILE = <filename 1..54 without-gen-vers>(...)
Die Eingaben werden in die angegebene BS2000-Datei protokolliert.
WRITE-MODE = *REPLACE / *EXTEND
Gibt an, ob eine bereits katalogisierte Datei überschrieben oder erweitert werden soll.
OUTPUT =
Gibt an, wohin die Ausgaben des Kommandos erfolgen sollen.
OUTPUT = *SYSOUT
Die Ausgabe erfolgt in die Systemdatei SYSOUT (d.h. im Dialog Ausgabe am Bildschirm, falls keine andere Zuordnung getroffen wurde).
OUTPUT = <filename 1..54>
Die Ausgaben des Kommandos werden in die angegebene BS2000-Datei geschrieben.
Kommando-Returncode
(SC2) | SC1 | Maincode | Bedeutung |
---|---|---|---|
0 | CMD0001 | Ohne Fehler | |
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. |
Hinweise
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 (bei Rückfragen), sind: rm, mv, bs2cp, mailx
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, tabs, mesg, write, talk, more, patch, pax, nohup, ls, fg, bg
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.
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>.
Damit greift das Kommando fc nur auf die Historie der EXEC-POSIX-CMD-Aufrufe zu
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. Deshalb können sich einzelne Kommandos anders verhalten als in der POSIX-Shell, sofern die Ergebnisse prozess-spezifisch sind (z.B. ftyp und bs2file sowie Zugriffe auf nicht exportierte Variablen oder Funktionen).
Innerhalb der Kommandosequenz hat die Definition von Alias-Namen mit dem Kommando alias keine Wirkung, da die Kommandosequenz mit dem Punkt-Kommando ausgeführt wird. Sollen Alias-Namen definiert und verwendet werden, muss die Kommandosequenz in eine (temporäre) POSIX-Datei kopiert werden. Die Datei muss das Execute-Recht bekommen und ausgeführt werden (nicht mit Punkt-Kommando).
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.