web-dev-qa-db-fra.com

Comment ajouter un script shell en tant que commande proposée par un composant logiciel enfichable?

Disons que j'ai un script shell basique foo.sh:

#!/bin/sh
while [ 1 ]
do
    echo "looping"
    sleep 1
done

Et je veux que ceci soit offert comme commande: /snap/bin/myapp.foo

J'ai le snapcraft.yaml:

apps:                                                                                                                                              
  foo:
    command: opt/foo/bin/foo.sh

parts:
  foo:
    source: .
    plugin: dump
    organize:
      foo.sh: opt/foo/bin/foo.sh

Il en résulte un fichier /snap/bin/myapp.foo mais un lien vers/usr/bin/snap. Je reçois une erreur de segmentation lors de l'exécution de la commande.

Quelle est la bonne façon de configurer snapcraft.yaml pour cela? Je me demande si je dois intégrer sh dans le composant logiciel enfichable? Ou si les scripts shell ne sont pas destinés à être utilisés dans des instantanés?

2
mpr

Ok donc il manquait deux choses.

1) Sous la section commande, la variable d’environnement $ SNAP doit être utilisée. Toutes les pièces que vous créez seront stockées par rapport à cette variable env lors de l'exécution.

2) Plutôt que d'appeler directement le script Shell, spécifiez l'interpréteur (dans ce cas, "sh"). Cela a échoué sans cela.

apps:
  foo:
    command: sh $SNAP/opt/foo/bin/foo.sh

parts:
  foo:
    source: .
    plugin: dump
    organize:
            foo.sh: opt/foo/bin/foo.sh

ADDENDUM 1: Il s’avère que le facteur le plus important pour mon utilisation est que dans Ubuntu 18, Snap est lié à la version de libc présente dans Ubuntu 16. C’est pourquoi Snap doit aspirer la libc6 d’Ubuntu 18 dans mon composant logiciel enfichable. turn crée des conflits avec des choses comme bash et dash/sh.

Si vous essayez d'exécuter des scripts Shell et que vous voyez des erreurs de segmentation, cela est probablement lié à cela. Un processus tente d'appeler le script Shell, lit le "Shebang" en haut ("#!/Bin/bash") et lorsqu'il s'exécute/bin/bash, un conflit libc se produit.

ADDENDA 2: Dans les cas où un processus parent lance des scripts Shell, veillez à ce que l'instruction "Shebang" en haut ne soit probablement pas valide. Par exemple, "#!/Bin/sh" ne sera pas résolu correctement car le chemin réel serait "$ SNAP/bin/sh", ce qui résoudrait la forme "/ snap/nom-projet/nom-révision-projet/bin/sh ".

Pour résoudre ce problème, assurez-vous que l'environnement PATH est transmis au programme avec le préfixe $ SNAP pour chaque chemin approprié. Puis ajustez le programme parent pour appeler le script avec l'interpréteur, par exemple, "bash child.sh" ou "child.sh".

2
mpr