Bonjour ,
Je suis débutant sur Linux et j'ai un script que je ne comprend. Pouvez vous m'expliquer son action ?
Merci.
enabled ${name#lib} || return 0
enabled(){
test "${1#!}" = "$1" && op== || op=!=
eval test "x\$${1#!}" $op "xyes"
}
Bonjour ,
Je suis débutant sur Linux et j'ai un script que je ne comprend. Pouvez vous m'expliquer son action ?
Merci.
enabled ${name#lib} || return 0
enabled(){
test "${1#!}" = "$1" && op== || op=!=
eval test "x\$${1#!}" $op "xyes"
}
# Bel exercice
Posté par Sytoka Modon (site web personnel) . Évalué à 2.
purement formel car je n'ai jamais cela dans les scripts que j'écris ;-)
[^] # Re: Bel exercice
Posté par pma . Évalué à 5.
Je confirme, ça me semble aussi pas très clair au premier abord et puis cette fonction a 2 ou 3 défauts.
Pour faire fonctionner cette fonction, il doit y avoir dans le script d'origine (ou dans un fichier de configuration inclus) des déclarations de variables correspondant à l'activation ou non de bibliothèques (c'est l'utilisation la plus probable, j'imagine que c'est dans un script ./configure de compilation ou similaire). Chaque variable est le nom d'une bibliothèque sans le préfixe "
lib" et ça va rendre le nommage des variables potentiellement non explicite:lapack="yes"# Pour liblapack, tout va bien. Maintenant 3 contres exemples:utils="yes"# pour libutils, et non pas "inclure les outils complémentaires ou non."c="yes"# Pour la libc, et non pas un bête compteur.libxml_plus_plus="no"# car on peut mettre l'opérateur + dans un nom de variable.Ensuite ton appel devait être dans une fonction, seul endroit où l'on utilise return. Par exemple:
example() {name="liblapack"enabled ${name#lib} || return 0return 1}Comme te l'apprendra le man de Bash, ${name#lib} sera remplacé par la valeur de la variable
nameà laquelle on aura retiré le préfixelibs'il existe. Donc l'appel est en fait "enabled lapack".Maintenant, le fonctionnement de la fonction elle-même:
Ligne 1:
test "${1#!}" = "$1" && op== || op=!=${1#!}: C'est la même chose, on prend le premier argument de la fonction et on retire un point d'esclamation s'il y en a un.test "${1#!}" = "$1": On teste si la valeur sans le point d'esclamation est la même qu'avec. Autrement dit, on teste s'il y a un point d'esclamation ou non.Si la condition est vraie (
&&),op==est exécuté. On peut l'écrire plus explicitementop = "=".Si la condition est fausse (
||),op=!=est exécuté. On peut l'écrire plus explicitementop = "!=".Donc la ligne 1 stocke un opérateur d'égalité ou de différence on fonction de si l'argument commence par un point d'esclamation ou non. Donc la fonction
enabled()sert aussi a tester si une librairie est désactivée, ça fait une fonction de moins mais ça peut être moins lisible quand on lit le code en diagonale.Ligne 2:
eval test "x\$${1#!}" $op "xyes"On commence par la substitution des variables:
${1#!}devient "lapack" si $1 était "!lapack".$opdevient!=si j'avais un préfixe!,=sinon.Donc la ligne est:
eval test "x\$lapack" != "xyes"Ensuite la commande
evalest exécutée, elle exécute le code qui lui est donné donc, en ayant retiré un niveau de protection:test x$lapack != xyes. Pour faire cette exécution, il y a une dernière substitution de variable (d'où l'utilisation dueval), donc le test estxyes != xyesdans notre cas.testrenvoi 1 àevalqui retourne à son tour cette valeur.Ligne 3:
}La fonction ne contenait pas de
return, c'est donc la valeur de la dernière ligne qui est retournée.Donc dans notre cas, la fonction retourne le 1 du
eval. La fonctionexample()a dit que liblapack n'est pas désactivée.[^] # Re: Bel exercice
Posté par esparic . Évalué à 1.
Merci Beaucoooooooup ton aide c'est tout ce que je demandais avec set -v set -x je pourrai avancer.
Effectivement c'est un configure que j'ai déjà modifié pour obtenir certaine dll avec MinGW. En fait j’essaie de compiler ffmpeg avec un c++ que je maitrise en transférant le maximum de fonction dans les dll.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.