Un shell interactif lit les commandes à partir de l'entrée utilisateur sur un terminal tty. Entre autres choses, un tel script lit les fichiers de démarrage lors de l'activation, affiche une invite et active un contrôle de job par défaut. L'utilisateur peut interagir avec le shell.
Un shell exécutant un script est toujours un shell non interactif. Tout de même, le script peut toujours accéder au tty. Il est même possible d'émuler un shell interactif dans un script.
#!/bin/bash MY_PROMPT='$ ' while : do echo -n "$MY_PROMPT" read line eval "$line" done exit 0 # Ce script d'exemple, et la plupart des explications ci-dessus est apportée # par Stephane Chazelas (encore merci). |
Considérons un script interactif qui demande une entrée par l'utilisateur, habituellement avec des fonctions read (voir Exemple 11-2). Dans la << vraie vie >>, c'est en fait un peu moins simple que ça. A partir de maintenant, on supposera qu'un script interactif est lié à un terminal tty, script appelé par un utilisateur à partir d'une console ou d'une xterm.
Des scripts d'initialisation et de démarrage sont nécessairement non interactifs car ils doivent fonctionner sans intervention humaine. Beaucoup de scripts administratifs et de maintenance système sont aussi non interactifs. Les tâches répétitives invariables nécessitent une automatisation par des scripts non interactifs.
Les scripts non interactifs peuvent fonctionner en arrière-plan, alors que les interactifs sont suspendus, attendant une entrée qui ne viendra jamais. Gérez cette difficulté en utilisant un script expect ou une entrée intégrée de type here document vers un script interactif fonctionnant comme une tâche de fond. Dans le cas le plus simple, redirigez un fichier pour apporter l'entrée à la fonction read (read variable <file). Ces détournements particuliers rendent possible l'utilisation de scripts à usage général tournant en mode soit interactif soit non interactif.
Si un script a besoin de tester si oui ou non il est lancé de manière interactive, il suffit simplement de savoir si la variable de l'invite, $PS1 est configurée. (Si le script attend une entrée de l'utilisateur, alors il a besoin d'afficher une invite).
if [ -z $PS1 ] # pas d'invite? then # non interactif ... else # interactif ... fi |
case $- in *i*) # shell interactif ;; *) # shell non interactif ;; # (Courtesy of "UNIX F.A.Q.," 1993) |
![]() | Il est possible de forcer un script à fonctionner en mode interactif avec l'option -i ou avec l'entête #!/bin/bash -i. Faites attention au fait que ceci peut entraîner un comportement étrange du script ou afficher des messages d'erreurs même si aucune erreur n'est présente. |
Précédent | Sommaire | Suivant |
Divers | Niveau supérieur | Scripts d'invocation |