web-dev-qa-db-fra.com

Impossible d'exécuter le script à partir de mon propre package

J'ai créé un package simple en utilisant ceci guide , mais je ne peux pas exécuter le script à l'intérieur.

Il y a un dossier nommé mypack, qui inclut /usr/bin/myscript.sh avec une commande (disons qu'il renvoie simplement un message comme "Hello World"), et un dossier nommé DEBIAN avec un control fichier avec ce texte à l'intérieur:

Package: mypack
Version: 1.0-1
Maintainer: Alex
Architecture: all
Section: misc
Description: echo me

Je l'ai construit et installé en utilisant dpkg-deb --build mypack; dpkg -i mypack.deb comme le dit le guide.

Enfin, lorsque je voulais exécuter le script pour voir si cela fonctionnait, je ne pouvais pas. J'ai essayé:

  1. myscript (retourne myscript: command not found)
  2. myscript.sh (retourne bash: /usr/bin/myscript.sh: Permission denied)
  3. Sudo myscript.sh (retourne Sudo: myscript.sh: command not found)
  4. mypack myscript et mypack myscript.sh (les deux renvoient mypack: command not found)

Comment puis-je l'exécuter alors pour que cela fonctionne réellement ou est-ce que je manque des étapes importantes qui ne me permettent pas d'exécuter le script?

6
Alex F

Votre script n'est pas défini comme exécutable; Tout comme un script qui n'est pas installé , vous devez vous assurer qu'il contient le bit exécutable.

Vous avez deux options:

  1. Lors de la création du package, assurez-vous que le bit d’exécutable est défini dans votre script avant la création du package , en l’exécutant dans votre répertoire de travail Avant construire le paquet:

    chmod + x /path/to/script.sh

OU ...

  1. Utilisez le script postinst de votre package pour définir le bit exécutable après l'installation . Ajoutez une commande au script .postinst similaire au suivant:

    chmod + x /usr/bin/myscript.sh

Pour certaines de mes choses, j'utilise les deux méthodes juste pour m'assurer que les choses sont définies comme exécutables. Cela crée parfois des maux de tête, mais il vaut mieux s’assurer que que ne pas s’assurer. Au moins à mon avis.


Quant au script ne pouvant pas être exécuté en tant que myscript, c'est parce que myscript et myscript.sh sont objets différents.

Si vous le souhaitez, procédez comme suit dans votre script .postinst pour votre paquet:

ln -s /usr/bin/myscript.sh /usr/bin/myscript

... et si vous résolvez le problème des bits exécutables, il devrait alors "fonctionner" pour les deux versions que vous essayiez, à la fois myscript.sh et myscript.

CEPENDANT la bonne façon de procéder est plutôt de conditionner le script sous la forme myscript et n'inclut pas l'extension Shell. Vous devez ensuite inclure une ligne Shebang au début (#!) indiquant l'interpréteur à utiliser. Puisque .sh pourrait être n'importe quoi. Ensuite, configurez le package pour qu'il installe simplement myscript. Comme le dit Muru, vous devriez éviter de faire des liens dans votre postinst, mais c'est vous qui décidez. Il existe de nombreux moyens différents pour atteindre votre objectif, mais il n'existe pas d'indication très stricte dans la documentation relative à l'emballage.

8
Thomas Ward