Les scripts shell compilés sont-ils meilleurs pour les performances?

Oct 20 2020

Après quelques recherches sur Google, j'ai trouvé un moyen de compiler des scripts BASH en exécutables binaires (en utilisant shc).

Je sais que le shell est un langage interprété, mais que fait ce compilateur? Améliorera-t-il les performances de mon script de quelque manière que ce soit?

Réponses

55 StephenKitt Oct 20 2020 at 15:21

Pour répondre à la question de votre titre, les scripts shell compilés pourraient être meilleurs pour les performances - si le résultat de la compilation représentait le résultat de l'interprétation, sans avoir à réinterpréter les commandes du script à plusieurs reprises. Voir par exemple ksh93lesshcomp ou zshleszcompile .

Cependant, shcne compile pas les scripts de cette manière. Ce n'est pas vraiment un compilateur, c'est un outil de «cryptage» de script avec diverses techniques de protection d'une efficacité douteuse. Lorsque vous compilez un script avec shc, le résultat est un binaire dont le contenu n'est pas immédiatement lisible; lorsqu'il s'exécute, il déchiffre son contenu et exécute l'outil pour lequel le script était destiné avec le script déchiffré, ce qui rend le script d'origine facile à récupérer (il est passé dans son intégralité sur la ligne de commande de l'interpréteur, avec un espacement supplémentaire pour tenter de faire c'est plus difficile à trouver). Les performances globales seront donc toujours pires: en plus du temps nécessaire pour exécuter le script d'origine, il y a le temps nécessaire pour configurer l'environnement et décrypter le script.

34 guest Oct 21 2020 at 21:34

Après quelques recherches sur Google, j'ai trouvé un moyen de compiler des scripts BASH en exécutables binaires (en utilisant shc).

Il est assez malheureux que cet shcengin soit toujours présent dans les résultats de recherche Google, même après avoir été complètement démystifié toutes ces années: shcn'est pas un compilateur, et il n'empêche pas le code source du script d'être regardé et "volé" .

Si quoi que ce soit, shc est encore plus stupide qu'il ne doit l'être, car, après avoir démêlé la source du script, il ne fait que la passer comme argument à bash -c, ce qui signifie qu'elle est visible par /proc/<pid>/cmdlinen'importe quel utilisateur, pas seulement celui qui exécute le script. Cela correspond également à la limite de longueur de Linux pour un seul argument de ligne de commande (128 Ko). Mais pour rendre les choses encore plus ridicules, la première partie de cet argument est remplie d'espaces blancs, donc elle n'apparaît pas dans ps;-)

Améliorera-t-il les performances de mon script de quelque manière que ce soit?

Oui, votre script peut ne pas fonctionner du tout, ce qui signifie qu'il se terminera plus tôt.

5 Paul_Pedant Oct 20 2020 at 18:53

En général, il n'y a aucun moyen de compiler un script shell, car un nouveau texte source peut être introduit par plusieurs méthodes au moment de l'exécution, ce qui a donc contourné la phase de compilation. Cette nouvelle source ne pourrait pas interagir avec les fonctions ou variables compilées.

Deux méthodes de création de source d'exécution seraient:

Créez un fichier annexe qui peut avoir été créé ou modifié depuis la compilation du script d'origine.

Construisez au moment de l'exécution une commande arbitraire dans une chaîne et exécutez-la.