On utilise cette commande comme sur l’exemple suivant :on pred do cmd
qui ne fait appel à la commande d’impression lpr que si le fichier existe (commande test).on test -r spool/file do lpr spool/file
Arguments de la ligne de commande
Le programme suivant argv.c affiche les arguments qui lui sont passés sur la liste de commande
#include <stdio.h> #include <stdlib.h> int main (int argc, char *argv[]) { int i; fprintf(stderr, " argc = %d\n", argc); for (i=0; i<argc ; i++) { fprintf(stderr, "argv[%d] = %s\n", i, argv[i]); } exit(EXIT_SUCCESS); }Ces quelques exemples d’exécution explicitent la manière dont les arguments de la ligne de commande sont gérés :
% ./argv emacs xclock xterm argc = 4 argv[0] = ./argv argv[1] = emacs argv[2] = xclock argv[3] = xterm % ./argv "emacs -u phm" "xclock -update 1" xterm argc = 4 argv[0] = ./argv argv[1] = emacs -u phm argv[2] = xclock -update 1 argv[3] = xtermBibliothèque de gestion de multiples commandes à arguments
La bibliothèque makeargv installée dans /home/enseign/PDS/*/ fournit deux fonctions de création et destruction d’arguments :
extern int makeargv(const char *s, const char *delimiters, char ***argvp); extern void freeargv(char **argv);Vous vous inspirerez de l’exemple suivant makeargv-main.c pour utiliser cette bibliothèque :
#include "makeargv.h" int main (int argc, char *argv[]) { int i, status; for (i=1; i<argc; i++) { /* traiter argv[i] */ char **cmdargv; char **arg; /* création du argv de l'argument i */ status = makeargv(argv[i], " \t", &cmdargv); assert(status>0); /* test: affichage */ fprintf(stderr, "[%s]\t%% ", cmdargv[0]); for (arg=cmdargv; *arg; arg++) fprintf(stderr, "%s ", *arg); fprintf(stderr, "\n"); /* libération mémoire */ freeargv(cmdargv); } exit(EXIT_SUCCESS); }Une exécution de ce programme d’exemple est la suivante :
% ./makeargv-main "cat -n" "grep -v foo" wc [cat] % cat -n [grep] % grep -v foo [wc] % wc
Exercice 9 (Redirection) Il s’agit d’implanter une commandequi exécute les commandes cmd... les unes après les autres en redirigeant leur sortie standard vers le fichier file qui est éventuellement tronqué au début de l’exécution de to.to file cmd...
Exercice 10 (Exécutions de commandes) On désire implanter un programme do qui exécute indépendamment et simultanément une série de commandes Shell données sur la ligne de commande. L’exécution du programme se termine quand l’ensemble des commandes a terminé. Le programme retourne alors un statut formé de la conjonction (et, défaut) ou de la disjonction (ou) des statuts retournés par les commandes selon la valeur de l’option. La syntaxe est la suivante :On utilise cette commande do suivant l’exemple suivant :do [--and|--or] command...do --and emacs mozilla xtermQuestion 1 Implantez la commande do.On désire que les commandes lancées par la do puissent accepter des paramètres et ainsi utiliser la commande de la manière suivante :
do --and "emacs -u phm" "xclock -update 1" xtermQuestion 2 Implantez cette extension de la commande do. Reportez vous à l’encart explicitant la manière dont les arguments de la ligne de commande sont traités. Vous pourrez utiliser la bibliothèque makeargv décrite dans l’encart pour gérer les paramètres de la ligne de commande.Une utilisation possible de la commande do est de ne s’intéresser qu’aux valeurs de retour des commandes lancées. Dans ce cas, il est possible de conclure sur la valeur de retour de la commande do dès qu’une des commandes retourne un succès (pour l’option --or, ou retourne un échec pour l’option --and) : on parle de conjonction ou disjonction coupe-circuit. Ce fonctionnement est activée par l’option --cc de la commande do.
Considérant l’option --cc, une fois le résultat acquis, il n’est pas utile de laisser poursuivre les exécutions des commandes dont le résultat ne sera pas exploité. L’option --kill, associée à --cc, indique de tuer (kill) les commandes non encore terminées alors que le résultat de do a pu être déterminé.
[fin provisoire du sujet...]
![]()
![]()