support clients /

L’exécution de commandes Système depuis SAS

Au cours d'un traitement SAS, vous avez parfois besoin d'interagir directement avec le système d'exploitation. Les besoins sont divers : créer un répertoire pour stocker une table, lister le contenu d'un répertoire à la recherche d'un fichier ou récupérer la valeur d'une variable d'environnement.
SAS permet l'exécution de commande système et la récupération du résultat dans une variable ou l'affichage du résultat dans le journal.

Plusieurs instructions SAS permettent d'effectuer ces tâches :

  • X
  • Call system
  • %sysexec
  • Systask
  • Filename pipe

X, call system et %sysexec

Ces instructions sont équivalentes. Elles permettent l'exécution d'une commande Système sans quitter la session SAS et sans récupérer de résultat.

  • Exemple d'utilisation de la commande X :

x 'mkdir /local/data/rep1';
x 'ls -al /local/data/rep1';

Si une commande comme 'ls' ou 'dir' est exécutée depuis SAS, le résultat est affiché dans la fenêtre Shell (Unix) ou DOS.

  • Exemple d'utilisation de la routine CALL SYSTEM :

data _null_;
call system ('cd /users/smith/report');
run;

En exécutant la commande 'cd /users/smith/report', toute recherche d'un fichier renseigné avec l'instruction 'filename' et avec un chemin relatif se fera à partir du répertoire '/users/smith/report'.

  • Exemple d'utilisation de la fonction macro %SYSEXEC :

%macro pwdls;
%sysexec %str(pwd;ls -l);
%mend pwdls;
%pwdls;

Il faut remarquer dans cet exemple que la fonction '%sysexec' permet l'exécution de plusieurs commandes dans la même instruction.

Instruction 'systask'

L'instruction 'systask' autorise l'exécution des commandes de façon asynchrone. Autrement dit, la commande va s'exécuter en arrière plan et le programme SAS va pouvoir traiter les instructions suivantes.

'Systask' permet non seulement d'exécuter une commande OS, mais aussi de récupérer le résultat dans une macro variable SAS ou dans le journal. Elle permet également l'affichage des tâches en cours ou l'arrêt d'une tâche, si nécessaire.

systask command "cp /tmp/p.log /local/users/fracaa/" taskname="copyjob1"
status=copysts1 shell;

Dans le Journal on obtient :

50 systask command "cp /tmp/p.log /local/users/fracaa/" taskname=copyjob1
51 status=copysts1 shell;
NOTE: Task "copyjob1" produced no LOG/Output.

Dans la commande ci-dessus, 'systask' a permis d'exécuter la commande système Unix 'cp' pour copier le fichier '/tmp/p.log' sur le répertoire '/local/users/fracaa'. Nous avons donné à cette tâche le nom de 'copyjob1' et nous avons récupéré le code retour dans la macro variable copysts1. Le contenu de cette macro variable peut être affiché dans le journal de SAS avec l'instruction '%put ©sts1 ;'.

Pour mettre fin à la tâche 'copyjob1', quand la commande système 'cp' est terminée, il faut utiliser l'instruction 'waitfor' :

waitfor _all_ copyjob1; 

Il est possible également de mettre fin à cette tâche, même si la commande système n'est pas finie, par l'instruction :

systask kill copyjob1;

L'affichage du statut des commandes lancées et en cours d'exécution, se fait avec l'instruction suivante :

systask list _all_;

Dans le Journal on obtient :

"copyjob1" --------------
Type: Task
State: COMPLETE
Status Macro Variable: copysts1
systask list _all_;
 

Instruction 'filename pipe'

L'instruction 'filename pipe' permet d'exécuter une commande Système et de récupérer son résultat dans une variable SAS ou dans le journal :

options ls=132 obs=max;

/* affichage des variables d'environnement */
filename test1 pipe "set";
data _null_;
length text $132;
infile test1 truncover;
input text 1-132;
put text=;
run;

Cette syntaxe produit un résultat identique à celle de la fonction 'systask' suivante :

systask command "set" wait taskname="test" shell;

Le résultat d'une telle commande peut être utile pour connaître les valeurs de certaines variables d'environnement sous Unix.
Nous avons un cas précis dans le fonctionnement des modules SAS/ACCESS®. Pour faire la liaison entre SAS et les bibliothèques d'une autre base de données, il est nécessaire sous Unix, de déclarer certaines variables d'environnement. L'accès ne se fait pas si l'initialisation de ces variables n'a pas été effectuée correctement. Dans ce cas, l'affichage des valeurs de ces variables dans une session SAS peut permettre de valider ou non la configuration mise en place.

1 options ls=132 obs=max;
2
3 /* affichage des variables d'environnement */
4 filename test1 pipe "set";
5 data _null_;
6 length text $132;
7 infile test1 truncover;
8 input text 1-132;
9 put text=;
10 run;


NOTE: The infile TEST1 is:
Pipe command="set"

text=_=/local/data/obelix/UNEDIC/SAS_9.1/sasexe/sas
text=AIXTHREAD_COND_DEBUG=OFF
text=AIXTHREAD_MNRATIO=1:1
text=AIXTHREAD_MUTEX_DEBUG=OFF
text=AIXTHREAD_RWLOCK_DEBUG=OFF
text=AIXTHREAD_SCOPE=S
text=AUTHSTATE=compat
text=DISPLAY=139.96.81.116:0.0
text=ERRNO=25
text=FCEDIT=/usr/bin/ed
text=HOME=/
text=IFS='
text='
text=inetd_dummy=xxx
text=Install_TKPATH=0/local/data/obelix/SAS_9.1/sasexe:/local/data/obelix/SAS_9.1/utilities/bin
text=LANG=fr_FR
text=LC__FASTMSG=true
text=LDR_CNTRL=LOADPUBLIC
text=LIBPATH=/local/data/obelix/SAS_9.1/sasjre/1.4.0/bin/:/local/data/obelix/
SAS_9.1/sasjre/1.4.0/bin/classic/:/local/data/

text=LINENO=1
text=LOCPATH=/usr/lib/nls/loc
text=LOGIN=root
text=LOGNAME=root
text=MAILCHECK=600
text=NLSPATH=/usr/lib/nls/msg/%L/%N:/usr/lib/nls/msg/en_US/%N:/usr/lib/nls/
msg/%L/%N.cat:/usr/lib/nls/msg/en_US/%N.cat

text=ODMDIR=/etc/objrepos
text=OPTIND=1
text=ORACLE_HOME=/local/data/obelix/oracle/oracle/product/10.2.0/db_1/
text=PAM_SERVICE=ftp
text=PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java14/jre/bin:/usr/java14/bin
text=PPID=295028
text=PS2='> '
text=PS3='#? '
text=PS4='+ '
text=PWD=/
text=RANDOM=26104
text=SAMPSIO='('\''!SASROOT/samples/base'\'' '\''!SASROOT/samples/connect'\'' '\''!SASROOT/samples/dbi'\'' '\'
text=SAMPSRC='('\''!SASROOT/samples/base'\'' '\''!SASROOT/samples/connect'\'' '\''!SASROOT/samples/dbi'\'' '\'
text=SAS_ALT_DISPLAY=:0.0
text=SASAUTOS=!SASROOT/sasautos
text=SASCFGPATH='!SASROOT/sasv9.cfg, !SASROOT/nls/en/sasv9.cfg, !SASROOT/sasv9_local.cfg'
text=SASROOT=/local/data/obelix/SAS_9.1
text=SECONDS=0
text=SHELL=/usr/bin/ksh
text=TERM=xterm
text=TK_Default_Options=0
text=TKPATH=/local/data/obelix/SAS_9.1/sasexe:/local/data/obelix/SAS_9.1/utilities/bin
text=TMOUT=0
text=TZ=NFT-1DFT,M3.5.0,M10.5.0
text=USER=root
text=WINDOWID=8388621
NOTE: 51 records were read from the infile TEST1.
The minimum record length was 1.
The maximum record length was 256.
One or more lines were truncated.
NOTE: DATA statement used (Total process time):
real time 0.26 seconds
cpu time 0.01 seconds

Pour plus de renseignements : Documentation Online SAS 

Càtalin Aldea
Consultant Support Clients - SAS France