Le 28/11/2012 17:47, Aurélien a écrit :
On Wed, Nov 28, 2012 at 3:48 PM, Jean Weisbuch <jean@plusquenet.net> wrote:
Une alternative en mksh qui doit aussi marcher sous ksh93 mais à vérifier ne
faisant appel qu'à egrep en commande externe pour récupérer le nombre de
cœurs physiques du CPU, en codant le script proprement on peux également se
débarrasser de l'utilisation de egrep :

Et printf, ou bien c'est une builtin ? En tout cas je concède que
c'est codé à l'arrache (déjà y'a des cat | :)). Mais vs bash, mksh ça
fait une dép en plus non ? Il y a un intérêt particulier que je
n'aurais pas vu ?

printf n'est "normallement" pas builtin dans mksh (en le compilant avec les options par défaut) mais les versions packagées pour Debian ont le printf builtin d'activé (vérifiable avec "whence printf" : renvoie le chemin de printf si non builtin, sinon renvoie "printf") donc oui, ça n'est effectivement pas "propre".

La doc de mksh à propos de printf (https://www.mirbsd.org/htman/i386/man1/mksh.htm) :
Formatted output. Approximately the same as the printf(1), utili-
            ty, except it uses the same Backslash expansion and I/O code as
            the rest of mksh. This is not normally part of mksh; however, dis-
            tributors may have added this as builtin as a speed hack. Do not
            use in new code.
Voici le bout de code qui remplace la ligne utilisant printf dans la version initiale du script (sachant qu'en plus j'avais oublié de prendre en compte le nombre de CPU dans le printf, ce qui est résolu ici) :
            typeset -Uui16 -Z$((3+MAXCORE)) i; ((i = 1 << (c % MAXCORE)))
            print "${i#16#}" > /proc/irq/${REPLY%:}/smp_affinity


Quant à la dépendance à mksh, le script dans sa version avec printf devrait pouvoir aussi tourner sous ksh93 et autres variantes de ksh (l'utilisation des paramètres avancés du typeset sur la "nouvelle version" ne pas passera pas sous ksh93).

Pour ceux qui ne connaitraient pas mksh, c'est un shell léger et rapide (souvent aussi rapide voire plus que (d)ash mais avec bien plus de fonctionnalités et moins de bugs).
De plus c'est un shell disponible sur de très nombreux systèmes/architectures (c'est d'ailleurs devenu le shell par défaut d'Android) et qui est encore activement développé et n'ayant quasi aucune dépendance (les dernières versions peuvent être compilées et fonctionner sur Debian 0.x si mes souvenirs sont bons et une version pour Windows existe également).
Il respecte mieux les normes POSIX que la plupart des shells et peut être utilisé pour /bin/sh (avec /bin/mksh-static) et /bin/ksh (de rares fonctions de ksh93 ne sont pas (encore) disponibles tel que les tableaux associatifs).

Personnellement, je fais installer mksh automatiquement sur toutes mes install (en version squeeze-backports sous Squeeze, la 40.4+ étant plus véloce et offrant quelques possibilités en plus par rapport à la 39.3), sachant que le mainteneur des packages Debian et Ubuntu n'est autre que le développeur principal du shell (qui est facilement "accessible" sur IRC et très sympathique).