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 : |
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 |
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 |
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 |
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 |
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 |
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" |
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 |
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 |
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) |
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 |
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 ";" |
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) |
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) |
-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 |
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 |
Vous pouvez écrire vos propres scripts.
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 |
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) |
read mavariable -> récupère la saisie utilisateur dans 'variable' echo "bonjour" -> affiche bonjour echo $mavariable # ou echo ${mavariable} |
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 : :..............................: |
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 ] |
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 |
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 |
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 |
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. |
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") |