sh/ksh non POSIX
Cette commande admet des syntaxes différente en sh et ksh. |
Shell Posix
L'export POSIX admet les syntaxes suivantes : |
Shells Unix et Posix : Introduction
Depuis le bourne shell, nombre d'évolutions ont été proposées pour programmer des scripts à partir de cette base. S'ils utilisent
une syntaxe et une philosophie très proches, ces différentes évolutions posent cependant des problèmes de portabilité. Pour les règler,
une norme a fini par être adoptée : IEEE POSIX.2 (ou ISO/IEC 9945-1:1990).
Ce petit cours signale les différences les plus importantes et les illustre ; il a pour but de produire le code le plus portable possible,
quel que soit l'OS utilisé.
Les différences
Les tableaux suivants indiquent quels sont les différences. Attention, une fonction obsolète peut fonctionner sous un shell Posix car la norme laisse des éléments sans spécification. Cela signifie que l'éditeur est libre d'implémenter comme bon lui semble (en conservant un comportement ksh par exemple). Cependant, ce n'est pas parce que cela fonctionne sur un environnement, que cela est portable. Les fonctions obsolètes doivent être abandonnées pour prétendre à la portabilité complète.
La commande interne export |
La commande interne readonly |
sh/ksh non POSIX La commande readonly envoyée sans paramètres donne normalement la liste des variables non modifiables. Elle est obsolète en shell POSIX. |
POSIX La commande correcte est : readonly -p |
La commande interne exec |
sh/ksh non POSIX
Sous ksh, la commande exec envoyée sans paramètres clos normalement tous les descripteurs de fichiers qui ne sont ni 0 (entrée standard),
ni 1 (sortie standard), ni 2 (sortie d'erreur). |
POSIX
|
La commande interne unset |
sh/ksh non POSIX
La commande unset employée sans option sur une fonction permet d'annuler la définition de cette fonction.
|
POSIX
unset -f nom_de_la_fonction_a_oublier |
Logique booléenne |
sh/ksh non POSIX Les commandes true et false (en minuscule) existent en shell non Posix. |
POSIX En Posix, true est vue comme une commande interne ( true=':' ) et false également ( false='let 0' ). |
Les signaux, Pid et PGID |
sh/ksh non POSIX
La commande kill (qui n'existe pas en sh) a évolué ; l'ancienne syntaxe est obsolète : |
POSIX
Posix introduit la notion de PGID, c'est à dire un PID négatif qui indique l'ordonnancement de tous les processus d'une même session. La syntaxe devient :
|
Command |
sh/ksh non POSIX N'existe qu'en POSIX |
POSIX Command transforme une commande interne spéciale (qui force la sortie du shell en cas d'erreur) en une commande interne régulière. Les commandes internes spéciales sont : break, continue, ., eval, exec, exit, export, readonly, return, set, shift, trap, unset, ; |
function |
sh/ksh non POSIX
function sert à définir une fonction en ksh |
POSIX function n'existe plus en shell Posix. |
Evaluation d'expression avec [[ expression ]] |
sh/ksh non POSIX Cette syntaxe qui n'existe pas en sh, est obsolète en POSIX (résultat non prévisible). |
POSIX
On utilisera la syntaxe simple du style : |
Variables PWD et OLDPWD, variable REPLY |
sh/ksh non POSIX
Ces variables donnent respectivement la valeur du répertoire courant et du précédent. Elles sont obsolètes en Posix,
tout comme la commande "cd -" qui revient au répertoire précédent et la fonction whence qui donne le chemin d'accès à un fichier
(on préferera un find ou un whereis).
|
POSIX On utilisera $(pwd) pour le répertoire courant. |
echo, print |
sh/ksh non POSIX sh ne connaît que la commande echo pour afficher, ksh préfère print. |
POSIX En posix, l'affichage se fera de préférence avec printf, echo est utilisable. |
Le cas le plus problématique : les instanciations dans un pipe |
sh/ksh non POSIX
En shell non Posix, la bouche suivante ne pose aucun problème : |
POSIX
En Posix, le pipe provoque la création de sous-shell (processus fils) puisque l'on fork. Or dans ce cas, les instanciations faites
par les fils ne se retrouvent pas dans le père, ce qui donne l'affichage : |