V4R40 -> le Shell interpreter

BoTTom |    Changer de couleur
 
QSH, le shell interpréteur (option 30 de 57xxSS1)
 
 il s'agit d'un shell compatible UNIX, lancé par QSH ou STRQSH
 
    il est proche du KHORN Shell
 
 vous pouvez passer des commandes unix comme :
 
 pwd : voir le répertoire en cours
 ls  : contenu du répertoire
 cd, etc pour naviguer dans l'arboresence
 set : pour fixer des variables d'environnement
 
 qui sont des commandes "internes"
 
les autres commandes sont recherchées dans le path et peuvent être des alias
 
vous pouvez aussi lancer une commande par STRQSH CMD('ls').
 
 ci dessous, la liste des commandes :
   pour le détail, voyez Knowledge Center

|    Changer de couleur
 
 alias        - Define or display aliases
 appletviewer - Java applet viewer
 break        - Exit from for, while, or until loop
 cd           - Change working directory
 colon (:)    - Null utility
 command      - Run a simple command
 continue     - Continue for, while, or until loop
 dot (.)      - Run commands in current environment
 echo         - Write arguments to standard output
 eval         - Construct command by concatenating arguments
 exec         - Execute commands and open, close, or copy file descriptors
 exit         - Exit from the shell
 export       - Set export attribute for variables
 false        - Return false value
 getconf      - Get configuration values
 getopts      - Parse utility options
 hash         - Remember or report utility locations
 jar          - Java archive tool
 java         - Run Java program
 javac        - Compile Java program
 


|    Changer de couleur
 
 javadoc      - Java API documentation generator
 javah        - Java C header and stub file generator
 javakey      - Java security tool
 javap        - Java class file disassembler
 jobs         - Display status of jobs in the current session
 kill         - Terminate or signal processes
 local        - Assign a local variable in a function
 native2ascii - Java native-to-ASCII converter
 print        - Write output
 printf       - Write formatted output
 pwd          - Return working directory name
 read         - Read a line from standard input
 readonly     - Set read-only attribute for variables
 return       - Return from a function
 rmic         - Java RMI stub compiler
 rmiregistry  - Java remote object registry
 serialver    - Java serial version
 set          - Set or unset options and positional parameters
 shift        - Shift positional parameters
 sleep        - Suspend invocation for an interval
 


|    Changer de couleur
 
 test         - Evaluate expression
 trap         - Trap signals
 true         - Return true value
 umask        - Get or set the file mode creation mask
 unalias      - Remove alias definitions
 unset        - Unset values and attributes of variables and functions
 wait         - Wait for process completion
 
vous pouvez écrire des scripts basés sur ces commandes ou bien des pgms
 "maison", basés sur le langage C. (utilisant prinf , etc ...)
de tels programmes sont livrés dans la bibliothèque QSHELL
 
 ar           - Create and maintain library archives
 basename     - Return non-directory portion of path name
 cat          - Concatenate and print files
 cc           - Compile C programs
 chgrp        - Change file group permission
 chmod        - Change file modes (permissions)
 chown        - Change file ownership
 clrtmp       - Clear the /tmp directory
 cmp          - Compare two files


|    Changer de couleur
 
 compress     - Compress data
 cp           - Copy files
 cut          - Cut out selected fields of each line of a file
 date         - Write the date and time
 dirname      - Return directory portion of path name
 echo         - Write arguments to standard output
 env          - Set environment for command invocation
 expr         - Evaluate arguments as an expression
 file         - Determine file type
 find         - Find files
 getjobid     - Display job information
 grep         - Search a file for a pattern
 head         - Copy the first part of files
 hostname     - Display the name of the current host system
 id           - Return user identity
 ln           - Link files
 logger       - Log messages
 logname      - Return user's login name
 ls           - List directory contents
 make         - Maintain, update, and regenerate groups of programs
 mkdir        - Make directories


|    Changer de couleur
 
 mv           - Move files
 od           - Dump files in various formats
 pax          - Portable archive interchange (supports tar format)
 pwdx         - Print working directory expanded
 rm           - Remove directory entries
 rmdir        - Remove directories
 sed          - Stream editor
 sort         - Sort, merge, or sequence check text files
 split        - Split files into pieces
 system       - Run CL command
 tail         - Copy the last part of a file
 tee          - Duplicate standard input
 test         - Evaluate expression
 touch        - Change file access and modification times
 tr           - Translate characters
 uname        - Return system name
 uncompress   - Expand compressed data
 uniq         - Report or filter out repeated lines in a file
 wc           - Word, line and byte/character count
 xargs        - Construct argument lists and invoke utility
 zcat         - Expand and concatenate data


|    Changer de couleur
 remarquons :
 
  wc   : pour compter le nombre de mots d'un fichier
  cat  : pour lister le contenu d'un fichier
  sort : tri le contenu d'un fichier
  split: éclate un fichier en plusieurs (on indique sur quelle "chaîne")
  grep : pour filtrer suivant une expression "régulière"
  find : recherche de fichiers et/ou de répertoires
 
  ainsi que l'utilisation des redirections :
 
       >         : redirige la sortie vers un fichier (en écrasement)
       >>        : redirige la sortie vers un fichier (en ajout)
    cde1 | cde2  : cde2 travaille à partir du résultat produit par cde1
    cde1 !! cde2 : exécute cde2 si cde1 se termine Anormalement
    cde1 && cde2 : exécute cde1, puis cde2 si cde1 se termine normalement
    cde1 : cde2  : exécute cde1 puis cde2 (sans condition)
  { cde1; cde2 } | cde3 : exécute cde1 puis cde2 et envoi le résultat à cde3
 
  exemple: 
    cat /qsys.lib/bdvin.lib/qsqlsrc.file/crtbase.mbr | grep -c date
    ->compte le nombre de lignes dans le membre crtbase contenant "date"


|    Changer de couleur
 
 grep '^.....C' /qsys.lib/mabib.lib/qrpglesrc.file/ile01.mbr
 
       ^ matérialise le début de ligne (la fin de ligne c'est $)
       . un caractère (n'importe lequel)
 
       on cherche donc le caractère C en position 6 dans le membre ile01
       (l'option -r aurait permis une recherche sur la totalité du fichier)
 
 grep '^.....[Cc]' /qsys.lib/mabib.lib/qrpglesrc.file/ile01.mbr
 
       [ ] indique une série de caractères admissibles (un ou logique)
 
       on cherche donc le caractère C ou c en position 6
       (l'option -i aurait permis une recherche insensible à la casse)
 
 grep '^......\*' /qsys.lib/mabib.lib/qrpglesrc.file/ile01.mbr
 
       * = n caractère(s), "n" étant compris entre 0 et l'infini
       \* déspécialise (le rend ordinaire) le caractère suivant \ (ici *)
 
       on cherche donc le caractère * en position 7


|    Changer de couleur
 
    find qui recherche des fichiers ou des répertoires
 
     find /QIBM -name '*.jar'               # cherche les fichiers ou les
                                            # répertoires ".jar" dans /QIBM
 
     find /QIBM -name '*.jar' -type f       # uniquement les fichiers
 
     find /QIBM -name '*.jar' -user QSYS    # appartenant à QSYS
 
     find /QIBM -name '*.jar' -mtime  +30   # modifié il y a + de 30 jours
 
     find /QIBM -name '*.jar'  ! -user QSYS # n'appartenant PAS à QSYS
                                            # la négation se fait par "!"
 
    Vous pouvez rediriger la sortie dans un fichier, par exemple :
 
     PGM
      CRTPF QTEMP/FINDOUT   RCDLEN(500)
      STRQSH CMD('find /QIBM -name '*.jar' >  +
                  /qsys.lib/qtemp.lib/findout.file/findout.mbr)
     ENDPGM


|    Changer de couleur
 
    Vous pouvez exécuter une commande pour chaque élément trouvé
 
     find /home  -user pascal -exec chown pierre {} \;
 
      .............................................
      : {} sera remplacé par l'élément en cours   :
      :                                           :
      : \  indique la fin de la commande          :
      :...........................................:
 
    Vous pouvez en même temps imprimer la liste
 
     find /home  -user pascal -exec chown pierre {} \; -print
 
 
    Vous pouvez aussi lancer un pgm à vous
 
     find /home  -user pascal -exec /qsys.lib/mabib.lib/monprog.pgm
 
     (le programme recoit des chaînes terminées par X'00, comme en C)
 


|    Changer de couleur
 
 sed permet d'éditer le contenu d'un fichier
 
   sed 'commande' fichier-à-lire > fichier-résultat [sinon affichage]
 
 commande étant composé de [/adresse1/][,/adresse2/]CDE[arguments]
 
 adresse (facultatif) ne sont concernées que les lignes contenant ce motif
                        (expression régulière) ou ce n° de ligne.
 
 CDE : p                   affiche
       d                   détruire la ligne
       a texte             ajout "texte" en fin de ligne
       c texte             remplace un texte[adresse] par un autre
       y /c1/c2            remplace un caractère [c1] par un autre [c2]
       s /motif1/motif2/o  remplace motif1 par motif2 avec des options:
 
                           n traiter la n-ième occurence de chaque ligne
                              (sinon seule la 1ere occurence est traitée)
                           g traiter toutes les occurences de chaque ligne
                           P affiche la ligne modifiée
 


|    Changer de couleur
 exemples
 
   sed '/BEGIN/,/END/p' fichier.txt
 
       affiche toutes les lignes entre BEGIN et END
 
   sed 'CCSID/d'        fichier.txt
 
       supprime du résultat toutes les lignes contenant "CCSID"
 
   sed 'CCSID/!d'       fichier.txt
 
       supprime toutes les lignes NE contenant PAS "CCSID"
         (donc n'affiche ou ne copie que les lignes contenant CCSID...)
 
   sed 's/CCSID/CODE/g' fichier.txt > fichier2.txt
 
       remplace toutes les chaines "CCSID" par "CODE"
 
   sed 's/ *;/;/g' fichier.txt fichier2.txt
 
       remplace " ;"(nombre de blancs indifférent grace à *)  par ";"


|    Changer de couleur
 Autres commandes 
 
 rm  fichier       pour détruire un/des fichier(s), caractère "*" admis
 rmdir directory   pour détruire un répertoire vide.
 setccsid ccsid    pour modifier le CCSID d'un fichier
 iconv -f ccsidO -t ccsidD fichier, pour convertir de ccsidO vers ccsidD
 
 ps pour voir les jobs d'un utilisateur (nouveauté V5R20)
    -s sous-système, pour voir les job d'un sous système
    -u profil      , pour voir les job d'un utilisateur
............................................................................
:> ps                                                                      :
:    PID DEVICE       TIME FUNCTION       STATUS    JOBID                  :
:    403 pcxp       000:00 cmd-qsh                  145818/qsecofr/pcxp    :
:    409 -          000:00 pgm-qzshsh     evtw      145824/qsecofr/qzshsh  :
:    410 -          000:00 pgm-ps         run       145825/qsecofr/qp0zspwp:
:..........................................................................:
 
 -> le fait de lancer QSH démarre un autre job (QZSHSH) de type BATCHI
 -> chaque commande (comme ici ps) démarre un process autonome QP0ZSPWP
 
 kill pour "tuer" un process sur son PID (N° comme ici 410)


|    Changer de couleur
 
 Vous trouverez également la commande "db2"
 
      db2 "SELECT * FROM qsys2.systables WHERE TABLE_OWNER = 'QSECOFR'"
 
 ainsi que les utilitaires ldap suivants :
 
 ldapadd, ldpadelete, ldapmodify, ldapsearch, ldpamodrdn
 
 
 La version 5.2 apporte un utilisataire Rfile pour manipuler les fichiers
  OS/400 (Database et fichier source)
 
  Rfile -h affiche l'aide
 
        -r lit un fichier IBM i (DB2 ou source) et écrit dans STDOUT
 
        -w écrit dans un fichier IBM i,ce qui vient de STDIN
           -a peut alors etre utilisé pour travailler en ajout (replace/dft)
           -l ne pas tronquer les données longues mais éclater sur plusieurs
                                                                    lignes.
       -b  données brutes (sans retour chariot)


|    Changer de couleur
 
        -s pour les sources, conserver dates et N° de séquence
           (sans cette option dates et N° de séquence sont enlevés)
 
        -Q nom de fichier en mode IBM i (OS/400)
           (sinon IFS = /QSYS.LIB/MABIB.LIB/FICHIER.FILE/MEMBRE.MBR)
 
        -c commande CL à passer avant (OVRDBF/PRTF admis)
 
        -C commande CL à passer après
 
Exemple
 
        echo "Bonjour" | Rfile -wbQ qprint
 
          génère un spool contenant une seule ligne
 
        echo "Bonjour" | Rfile -wbQ -c
        "ovrprtf file(qprint) outq(xxx) splfname(qshprt) hold(*yes)" Qprint
 
          génère un spool nommé QSHPRT dans l'OUTQ xxx d'une seule ligne
 


|    Changer de couleur
  avant='ovrprtf qprint devtype(*userascii) spool(*yes)'
  apres="lpr file(qprint) system(srvlinux) prtq('lp01') transform(*no)"
 
 cat -c mydoc.ps | Rfile -wbQ -c "$avant" -C "$apres" qprint
 
   imprime le contenu d'un fichier postscript dans un spool après avoir
    spécifié l'option *UserASCII pour ce dernier, puis l'envoi.
 
 Enfin la V5R30 propose catsplf pour écrire un spool vers STDOUT
 
  catsplf -j n°job/user/nom-job nom-du-spool n°spool
 
     catsplf -j 123456/QSECOFR/DSP02 QSYSPRT 1 > /tmp/spool.txt
 
 toutes ces commandes sont dans le répertoire '/usr/bin' et sont en fait
  des alias pointant vers des pgms situés dans les bibliothèques de l'OS.
  (Bibliothèque QSHELL en général)
 
pour voir le contenu, cde OS/400  wrklnk '/usr/bin/*'
    (pour voir le pgm réel passez l'option 12 devant un alias).
 
             ou bien  ls -l /usr/bin


|    Changer de couleur

 Vous pouvez écrire vos propres scripts.

  # un commentaire
les paramètres recus (255 max.) sont nommés :
    $1 pour le premier, $2 pour le deuxième, etc...  
  un paramètre peux contenir un nom de commande
echo $1
$1   #affiche et exécute la commande contenue dans paramètre 1
 
  set     assigne des valeur aux paramètres
 
       -> set v1 v2 # assigne v1 à $1 et v2 à $2
 
  shift  décale les paramètres vers la gauche
 
       -> $1 disparait, $2 devient $1, $3 devient $2, etc
 
  $0     contient le nom du script lui-même
 


|    Changer de couleur

 Variables
 
 
  mavariable=valeur
 
       -> variable (non typée) déclarée et initialisée
 
  readonly mavariable=valeur
 
       -> variable déclarée, initialisée, non modifiable

  declare -option mavariable (V5r2)
         -> variable typée : -E numérique flottant
-i integer
-u caractères majuscules
-l caractères minuscules
    typeset -option mavariable          -> modifie le type d'une variable existante let mavariable=a+(b/4=) #notez l'absence de $          -> attribut le résultat d'une expression arithmétique     unset mavariable     -> détruit une variable (elle n'existe plus)

Il existe des variable prédéfinies comme JOBNAME
et les "classiques" du monde Unix

|    Changer de couleur

 
 
  read mavariable
 
       -> récupère la saisie utilisateur dans 'variable'
 
  echo "bonjour"
 
       -> affiche bonjour
 
  echo $mavariable # ou echo ${mavariable}
         -> affiche le contenu de 'variable'     echo "bonjour $nom"          -> affiche "bonjour " suivi du contenu de 'nom'     echo ${nom:2:3}          -> affiche un substring de nom de 2 sur 3 (car. 2,3,4)     echo ${nom/as400/IBMi}          -> affiche nom en remplacant le 1er "as400" par "IBMi"  
echo ${nom//as400/IBMi}          -> affiche nom en remplacant tous les "as400" par "IBMi"

echo ${#nom}          -> affiche la longueur de nom

|    Changer de couleur
   assignation d'une valeur à une variable
 
     variable=valeur  par exemple I=0
 
   les tests se font sous la forme
 
   if booleen , booleen pouvant être une variable, le mot true|false
                ou une fonction retournant vrai|faux
 
   la fonction "test" compare deux opérandes et retourne vrai ou faux
 
                            ................................
   if condition1            : Exemple :                    :
      then commande1        :                              :
   elif condition2          :  if test "$I"  -eq "0"       :
      then commande2        :     then echo "zero"         :
   else                     :  elif  test "$I" -eq "1"     :
      commande3             :     then echo "un"           :
   fi                       :  else                        :
                            :     echo "nombre $I"         :
                            :  fi                          :
                            :..............................:


|    Changer de couleur
 
 les tests peuvent aussi être notés entre [ et ] (identique à test)
 
 Les tests se font via =(egal), !=(différent de) pour l'apha,
 
                       -eq, -lt, -le, -gt, -ge pour le numérique.
 
 
 on peut aussi tester les propriétés d'un fichier
 
  -a nomdefichier : vrai si le fichier existe (l'option -e est identique)
  -s nomdefichier : vrai si le fichier n'est pas vide
  -d nomdefichier : vrai si le fichier est un répertoire
  -h nomdefichier : vrai si le fichier est un lien
  -f nomdefichier : vrai si le fichier est "ordinaire"
  -r nomdefichier : vrai si le fichier est accessible en lecture
  -w nomdefichier : vrai si le fichier est accessible en écriture
  -x nomdefichier : vrai si le fichier est exécutable
 
 
     exemple [ -d /etc ]
 


|    Changer de couleur
 
 Pour les boucles vous utiliserez
 
 while test (votre test)              ..............................
  do                                  : while test "$i" -lt "5"    :
                                      :  do                        :
                                      :     echo "compteur: $i"    :
  ...                                 :     i=$(($i + 1))          :
  ...                                 :  done                      :
                                      :                            :
 done                                 :............................:
 
  ou bien until (même syntaxe)
 
 la bouble for est aussi trés puissante :
 
 for var in valeur1 valeur2 valeur3 ....valeurn
  do
   ...
   ...
 enddo


|    Changer de couleur
 
  for var in $*  (passe en revue tous les paramètres)
   do
    ...
  enddo
 
  for var in 'cde'  (travail avec tous les éléments retournés par cde)
   do
    ...
  enddo
 
   exemple :
  ----------
  for var in *.h
   do
        # travaille avec tous les fichiers se terminant par .h
        echo $var
   enddo
 
 


|    Changer de couleur
 
 pour lancer un script :
 ---------------------
 
      monscript        --> lance le script dans une nouvelle session
     .monscript        --> lance le script dans la session en cours.
 
 Ou bien, lancez un script depuis un CL par STRQSH. 
 
 
  la variable d'environnement QIBM_QSH_CMD_OUTPUT permet de fixer la sortie
 
     NONE   : pas d'affichage (mode silencieux)
 
     STDOUT : affichage dans le terminal destiné au C (il faut faire ENTER)
 
     FILE=chemin       : sortie dans un fichier (écrasé)
 
     FILEAPPEND=chemin : sortie en ajout dans un  fichier
 
 


|    Changer de couleur
 Vous recevrez les messages suivants :
 
 -QSH0005 : fin du process, le status [0-255] est dans les 4 premiers octets
 
 -QSH0006 : fin du process par un avertissement (signal)
 
 -QSH0007 : fin anormale du process
 
 
 Les messages sont envoyés de type achèvement (*COMP), sauf à placer "Y"
 dans la variable d'environnement QIBM_QSH_CMD_ESCAPE_MSG. (*ESCAPE)
 
 
 rappel: RMVENVVAR pour détruire une variable d'environnement.
 
         ADDENVVAR pour créer (et initialiser) une variable.
         -> la commande shell export , permet aussi cela.
 
         CHGENVVAR pour modifier le contenu
 
         WRKENVVAR permet de les voir.
 


|    Changer de couleur
 
 Une autre variable d'environnement peut-être pratique, c'est
 
   QSH_USE_PRESTART_JOB (contenant "Y")
 
cela oblige QSH à utiliser des travaux à démarrage anticipés, s'ils
 existent, pour lancer les process QP0ZSPWP.
 
 
Il faut au préalable avoir saisi :
 ...................................................................
 : ADDPJE SBSD(QINTER) PGM(QSYS/QP0ZSPWP) INLSJOBS(2) THRESOLD(5)  :
 :        ADLJOBS(3) JOBD(QGPl/QDFTJOBD) MAXUSE(1) POOLID(1)       :
 :.................................................................:
 
Pour renseigner une variable d'environnement, vous pouvez utiliser un
 script, avec   "export -s QSH_USE_PRESTART_JOB=Y"
 
Le mieux alors, étant de placer ce script dans :
 
       - /etc/profile            (script commun à tous le monde)
       - /home/nom-user/.profile (script pour "nom-user")





©AF400