web-dev-qa-db-fra.com

le fichier shell ouvre le terminal et exécute une séquence de commandes dans un ordre spécifique

Ce que j'avais l'habitude de faire, c'est:

  1. Ouvrez manuellement une instance de terminal pour exécuter les commandes et les fichiers Shell suivants

  2. Courir

    PACKAGE_PATH=/home/userA/package1:/home/userA/package2:$PACKAGE_PAT‌​H
    
  3. courir:

    cd /home/userA/scripts
    
  4. courir:

    varset.sh
    

    qui exporte et définit certaines variables.

  5. courir:

    source ff.sh $input $output
    
  6. courir:

    bb.sh
    

    qui me demande de saisir un numéro lors de son exécution.

  7. courir

    bc.sh 8
    

J'ai donc dû les copier et coller manuellement dans le terminal avant chaque exécution.

Ce que je veux faire maintenant, c'est mettre tout cela dans un fichier script qui ouvrira automatiquement le terminal et les exécutera en séquence afin que la commande suivante ne s'exécute que lorsque la première est terminée, de sorte que je n'ai pas à le faire manuellement plus.

Après avoir appliqué la suggestion de muru trouvée ici J'ai utilisé le script ci-dessous uniquement pour les étapes 1 à 4 mais cela ne fonctionne pas correctement:

gnome-terminal -x Sudo -u userA bash -c 'PPACKAGE_PATH=/home/userA/package1:/home/userA/package2:$PACKAGE_PATH; cd /home/userA/scripts; source varset.sh; bash'` 

Il n'est pas exécuté dans la même séquence que je le dis.

Cela ouvre avec succès le terminal mais la première ligne apparaît dans le terminal est un message qui se trouve dans varset.sh (bien que ce devrait être la troisième commande à exécuter) et l'autre chose est qu'aucune des variables qui devraient être définies à l'aide de ce varset.sh est défini, par exemple lorsque j'utilise echo $ var1 (qui se trouve dans variables.sh) n'affiche rien ce qui signifie que les variables ne sont pas définies la seule chose qui fonctionne dans variables.sh est le message d'écho affiché.

La deuxième ligne qui apparaît dans le répertoire est le répertoire de travail du terminal qui est défini sur /home/userA/scripts.

La troisième chose est que cette commande PACKAGE_PATH=PACKAGE_PATH=/home/userA/package1:/home/userA/package2:$PACKAGE_PATH qui définit la variable $ PACKAGE_PATH ne fonctionne pas.

Donc, si quelqu'un pouvait vous conseiller sur la façon d'exécuter ces commandes et les fichiers Shell dans la séquence demandée.

1
Tak

Écrivez simplement un script:

#!/usr/bin/env bash

PACKAGE_PATH=/home/userA/package1:/home/userA/package2:$PACKAGE_PAT‌​H

cd /home/userA/scripts
## You need to source this script if it defines variables. Otherwise
## the variables won't be available to your main script. '.' is the same
## as 'source' but more portable to different shells.
. varset.sh &&


. ff.sh $input $output &&
bb.sh && 
bc.sh 8 &&

Le && afater chaque commande garantit que la suivante ne sera exécutée que si la première se termine avec succès.

Vous pouvez maintenant enregistrer le script sous ~/scripts/foo.sh, rendez-le exécutable (chmod 744 ~/scripts/foo.sh) et l'exécuter à partir d'un terminal:

~/scripts/foo.sh

Vous pouvez également créer un .desktop fichier pour cela et exécutez-le en double-cliquant comme expliqué ici . Changez simplement le Terminal=false ligne vers Terminal=true.

1
terdon