• Aucun résultat trouvé

Un script lançant exec sur lui-même

Dans le document Guide avancé d'écriture des scripts Bash (Page 188-191)

Partie Part 4. Commandes

Exemple 14.25. Un script lançant exec sur lui-même

---# Les lignes suivantes ne s'exécutent jamais.

echo "Cet echo ne sera jamais exécuté."

exit 99 # Ce script ne sortira jamais par ici.

# Vérifier le code de sortie après l'exécution du

#+ du script avec un 'echo $?'.

# Cela ne sera *pas* 99.

Exemple 14.25. Un script lançant exec sur lui-même

#!/bin/bash

# self-exec.sh echo

echo "Cette ligne apparaît UNE FOIS dans le script, cependant elle continue à s'afficher."

echo "Le PID de cette instance du script est toujours $$."

# Démontre qu'un sous-shell n'est pas un processus fils.

echo "==================== Tapez Ctl-C pour sortir ===================="

sleep 1

exec $0 # Lance une autre instance du même script remplaçant le précédent.

echo "Cette ligne ne s'affichera jamais!" # Pourquoi pas ? exit 99 # Ne quittera pas ici.

# Le code de retour ne sera pas 99.

Commandes internes et intégrées

Un exec sert aussi à réaffecter les descripteurs de fichiers330. Par exemple,exec <fichier-zzzremplacestdinpar le fichierfichier-zzz.

Note

L'option-execde find n'estpas du toutla même chose que la commande shell intégrée exec.

shopt

Cette commande permet de changer les options du shell au vol (voir l'Exemple 24.1, « Alias à l'intérieur d'un script » et l'Exemple 24.2, « unalias : Configurer et supprimer un alias »). Elle apparaît souvent dans les fichiers de démarrage de Bash mais a aussi son utilité dans des scripts. Nécessite la version 2465, ou ultérieure, de Bash.

shopt -s cdspell

# Permet des petites erreurs dans le nom des répertoires avec 'cd' cd /hpme # Oups! J'ai mal tapé '/home'.

pwd # /home

# Le shell a corrigé la faute de frappe.

caller

Placer une commande caller dans une fonction352 affiche des informations surstdoutà propos de celui qui a appelé cette fonction.

#!/bin/bash fonction1 () {

# À l'intérieur de fonction1 ().

caller 0 # Parle-moi de lui.

}

fonction1 # Ligne 9 du script.

# 9 main test.sh

# ^ Numéro de ligne où a eu lieu l'appel de la fonction.

# ^^^^ Appelé depuis la partie "main" du script.

# ^^^^^^^ Nom du script appelant.

caller 0 # N'a aucun effet parce qu'il n'est pas à l'intérieur d'une fonction.

Une commande caller peut aussi renvoyer des informations de l'appelant sur un script inclus à l'intérieur d'un autre script. De façon analogue à une fonction, ceci est un « appel de sous-routine ».

Cette commande est utile pour le débogage.

Commandes

true

Une commande qui renvoie un succès (zéro) comme état de sortie44, mais ne fait rien d'autre.

bash$ true bash$ echo $?

0

# Boucle sans fin

while true # alias pour ":"

do

operation-1 operation-2 ...

operation-n

Commandes internes et intégrées

6Le hachage (ou découpage) est une méthode pour créer des clés de recherche pour des données stockées dans une table. Les éléments de données eux-mêmes sont « découpés » pour créer des clés en utili-sant un des nombreux algorithmes (méthodes ou recettes) simples de mathématiques.

Un avantage du hachage est qu'il est rapide. Un inconvénient est que les « collisions » -- où une seule clé correspond à plus d'un élément de données -- sont possibles.

Pour des exemples de hachage, voir Exemple A.22, « Bibliothèque de fonctions de hachage » et Exemple A.23, « Coloriser du texte en utilisant les fonctions de hachage ».

7La bibliothèque readline est utilisée par Bash pour lire les entrées utilisateur dans un shell interactif.

# A besoin d'un moyen pour sortir de la boucle ou le script ne s'arrêtera pas.

done false

Une commande qui renvoie un état de sortie44 correspondant à un échec, mais ne fait rien d'autre.

bash$ false bash$ echo $?

1

# Tester "false"

if false then

echo "false évalué à \"true\""

else

echo "false évalué à \"false\""

fi

# false s'évalue "false"

# Boucle while "false" (boucle nulle) while false

do

# Le code suivant ne sera pas exécuté.

operation-1 operation-2 ...

operation-n

# Rien ne se passe!

done type [cmd]

Identique à la commande externe which, type cmd identifie « cmd ». Contrairement à which, type est une commande inté-grée à Bash. L'option-aest très utile pour que type identifie desmots cléset descommandes internes, et localise aussi les commandes système de nom identique.

bash$ type '['

[ is a shell builtin bash$ type -a '[' [ is a shell builtin

[ is /usr/bin/[

bash$ type type

type is a shell builtin hash [cmds]

Enregistre le chemin des commandes spécifiées -- dans une table de hachage du shell6-- donc le shell ou le script n'aura pas besoin de chercher le$PATHsur les appels futurs à ces commandes. Quand hash est appelé sans arguments, il liste simple-ment les commandes qui ont été stockées. L'option-rréinitialise la table de hachage.

bind

La commande intégrée bind affiche ou modifie les correspondances de touche de readline7. Commandes internes et intégrées

help

Récupère un petit résumé sur l'utilisation d'une commande intégrée au shell. C'est l'équivalent de whatis pour les commandes intégrées.

bash$ help exit exit: exit [N]

Exit the shell with a status of N. If N is omitted, the exit status is that of the last command executed.

14.1. Commandes de contrôle des jobs

Certaines des commandes de contrôle de jobs prennent en argument un identifiant de job (job identifier). Voir la table à la fin de ce chapitre.

jobs

Liste les jobs exécutés en tâche de fond en indiquant le numéro de job. Pas aussi utile que ps.

Note

Il est trop facile de confondre les jobs et les processus. Certaines commandes intégrées159, telles que kill, di-sown et wait acceptent soit un numéro de job soit un numéro de processus comme argument. Les commandes fg, bg et jobs acceptent seulement un numéro de job.

bash$ sleep 100 &

[1] 1384 bash $ jobs

[1]+ Running sleep 100 &

« 1 » est le numéro de job (les jobs sont maintenus par le shell courant). « 1384 » est le PID ou numéro de pro-cessus (les propro-cessus sont maintenus par le système). Pour tuer ce job/propro-cessus, faites soit un kill %1 soit un kill 1384.

Merci, S.C.

disown

Supprime le(s) job(s) de la table du shell des jobs actifs.

fg, bg

La commande fg fait basculer un job, qui tournait en tâche de fond, en avant-plan. La commande bg relance un job suspendu en tâche de fond. Si aucun numéro de job n'est spécifié, alors la commande fg ou bg agit sur le job en cours d'exécution.

wait

Suspend l'exécution du script jusqu'à ce que tous les jobs en tâche de fond aient terminé, ou jusqu'à ce que le numéro de job ou l'identifiant de processus spécifié en option se termine. Retourne l'état de sortie44 de la commande attendue.

Vous pouvez utiliser la commande wait pour empêcher un script de se terminer avant qu'un job en arrière-plan ne finisse son exécution (ceci créerait un processus orphelin).

Dans le document Guide avancé d'écriture des scripts Bash (Page 188-191)