Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

EXECUTE-POSIX-CMD

&pagelevel(3)&pagelevel

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

CMD = <filename 1..54> / list-poss(50): <c-string 1..1500 with-low>

,INPUT-LOG-FILE = *NONE / <filename 1..54 without-generation-version>(...)


<filename 1..54 without-gen-vers>(...)



|

WRITE-MODE = *REPLACE / *EXTEND

,OUTPUT = *SYSOUT / <filename 1..54>

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

0CMD0001Ohne Fehler

1CMD0202Fehler beim Aufruf der Prozedur ECXCMD (siehe Hinweis zum SDF-Fehler CMD0065 oben)
x64CCM0999Das Shell-Kommando, die Kommandosequenz bzw. das Skript liefert einen Exit-Status mit dem Wert x (ungleich 0), der dem SC2 entnommen werden kann