GNU/Linux >> Tutoriels Linux >  >> Linux

Modifier le script shell pendant son exécution

Il fait affecter, au moins frapper dans mon environnement, mais de manière très désagréable . Voir ces codes. Premier a.sh :

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh :

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

Faire

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

Dans mon cas, la sortie est toujours :

hello
hello
That's all.
That's all.

(Bien sûr, il est préférable de l'automatiser, mais l'exemple ci-dessus est lisible.)

[modifier] C'est imprévisible, donc dangereux. La meilleure solution de contournement est , comme décrit ici mettez tout entre accolades, et avant l'accolade fermante, mettez "exit" . Lisez bien la réponse liée pour éviter les pièges.

[ajouté] Le comportement exact dépend d'une nouvelle ligne supplémentaire, et peut-être aussi de votre saveur Unix, de votre système de fichiers, etc. Si vous voulez simplement voir quelques influences, ajoutez simplement "echo foo/bar" à b.sh avant et/ou après la ligne "lire".


Essayez ceci... créez un fichier appelé bash-is-odd.sh :

#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh

Cela démontre que bash interprète effectivement le script "au fur et à mesure". En effet, éditer un script de longue durée a des résultats imprévisibles, insérer des caractères aléatoires etc. Pourquoi ? Parce que bash lit à partir de la position du dernier octet, l'édition décale l'emplacement du caractère en cours de lecture.

Bash est, en un mot, très, très dangereux à cause de cette "fonctionnalité". svn et rsync lorsqu'ils sont utilisés avec des scripts bash, ils sont particulièrement troublants, car par défaut, ils "fusionnent" les résultats... édition en place. rsync a un mode qui corrige cela. svn et git ne le font pas.

Je présente une solution. Créez un fichier appelé /bin/bashx :

#!/bin/bash
source "$1"

Utilisez maintenant #!/bin/bashx sur vos scripts et exécutez-les toujours avec bashx au lieu de bash . Cela résout le problème - vous pouvez en toute sécurité rsync vos scripts.

Solution alternative (en ligne) proposée/testée par @AF7 :

{
   # your script
} 
exit $?

Les accolades protègent contre les modifications et la sortie protège contre les ajouts. Bien sûr, nous serions tous bien mieux lotis si bash avait une option, comme -w (fichier entier), ou quelque chose qui a fait ça.


Divisez votre script en fonctions, et chaque fois qu'une fonction est appelée, vous source à partir d'un fichier séparé. Ensuite, vous pouvez modifier les fichiers à tout moment et votre script en cours d'exécution reprendra les modifications la prochaine fois qu'il sera sourcé.

foo() {
  source foo.sh
}
foo

Linux
  1. Expiration du délai dans un script shell ?

  2. Sur quel shell suis-je en cours d'exécution ?

  3. Commande Linux pour vérifier si un script shell est en cours d'exécution ou non

  4. Comment insérer une nouvelle ligne dans le script shell Linux ?

  5. Shell Script while loop:[ autour d'un pipeline manquant `]'

Script Shell avec fonction et paramètre comme variables ?

Eof inattendu lors de la recherche d'un ```' correspondant - Script Bash ?

Le script shell se bloque sur la commande de messagerie ?

Vérifier la connectivité de la base de données à l'aide du script Shell

Envoi d'un mail à partir d'un script shell Linux

Bibliothèque de sortie de script shell coloré