Qu'est-ce que le & terminator ?
La queue &
à la fin d'une commande est utilisé pour mettre les commandes en arrière-plan. Il s'agit en fait d'une syntaxe standard spécifiée par Norme POSIX :
Listes asynchrones
Si une commande est interrompue par l'opérateur de contrôle ('&'), le Shell doit exécuter la commande de manière de manière asynchrone dans un sous-shell. Cela signifie que le Shell n'attendra pas la fin de la commande avant d'exécuter la commande. que la commande se termine avant d'exécuter la commande suivante.
Le format pour exécuter une commande en arrière-plan est le suivant :
commande1 & [commande2 & ... ]
Le but des commandes d'arrière-plan est d'exécuter une commande sans que le Shell principal en Shell ou le Shell interactif attende la commande, ce qui bloquerait l'exécution d'autres commandes et rendrait l'attente gênante pour l'utilisateur. Ceci est pratique pour Démarrer des commandes de longue durée mais vous devez continuer à travailler dans le Shell actuel. Comme vous pouvez le deviner, cela provient de l'époque où il n'y avait pas d'émulateurs de terminal à onglets multiples, mais où les terminaux étaient du matériel physique réel connecté à un ordinateur lui-même.
D'après la définition, vous pouvez voir que &
sert également de terminateur de commande pour les listes de commandes, tout comme ;
fait. Dans votre exemple spécifique, pyprogramm >> /dev/null 2>&1 &
il n'y a qu'une seule commande dans la liste.
Séquentielle ; listes vs. asynchrone & listes
Plus généralement,
echo Hello ; echo World ;
y
echo Hello & echo World &
sont deux exemples de listes terminées par le caractère ;
y &
opérateurs. Une différence est que &
La liste terminée aura une entrée connectée à /dev/null
si le contrôle des tâches est désactivé :
Si le contrôle des tâches est désactivé (voir set, -m), l'entrée standard d'un fichier liste asynchrone, avant que toute redirection explicite ne soit effectuée, sera considérée comme étant affectée à un fichier qui a les mêmes propriétés que /dev/null. Cela ne se produira pas si le contrôle des tâches est activé. Dans tous les cas, la redirection explicite de l'entrée standard devra l'emporte sur cette activité.
Dans une liste séquentielle, cependant, chaque commande a toujours stdin
connecté au terminal s'il n'y a pas de redirections explicites.
Notez également que, d'après la définition que nous avons mentionnée précédemment, &
exécute les commandes dans le sous-shell. En revanche, l'option ;
La liste terminée est exécutée dans le Shell courant. Il y a aussi une différence dans les statuts de sortie. Pour &
la norme dit :
L'état de sortie d'une liste asynchrone doit être égal à zéro.
Ceci est significatif lorsque vous voulez mettre plusieurs commandes en arrière-plan. Lorsque vous écrivez un script ou une commande, vous devrez choisir des commandes pour lesquelles vous ne vous souciez pas de savoir si elles ont échoué ou non, ou vous devrez trouver un moyen de gérer l'état de sortie non nul ( error ). Dans votre exemple spécifique, pyprogramm >> /dev/null 2>&1 &
qui s'exécute en arrière-plan devrait avoir un moyen d'indiquer s'il a échoué ou non, mais il faut juger que vous utilisez 2>&1
vous masquez la sortie d'erreur en redirigeant, et vous supposez probablement que le script ne devrait pas échouer.
En revanche, ;
Le statut de sortie est défini comme suit :
L'état de sortie d'une liste séquentielle est l'état de sortie de l'élément dernière commande de la liste.
Encore une fois, cela a des implications sur la façon dont vous écrivez une liste séquentielle de commandes en ligne de commande et comment vous voulez que les choses soient gérées si certaines des commandes de la liste échouent.
Notes annexes et lectures complémentaires
-
Le fait que ce soit une définition POSIX signifie que tous les shells de type Bourne, c'est-à-dire bash
, dash
y ksh
doit le soutenir.
-
&
dans la redirection est différent de &
comme terminateur de commande. Cela signifie dupliquer (copier) l'objet descripteur de fichier. Voir Que signifie exactement & dans la redirection de sortie ?
-
Sur bash
il y a aussi |&
(notez qu'il n'y a pas d'espace entre le tuyau et l'esperluette). À partir de manuel bash :
Si |& est utilisé, l'erreur standard de la commande, en plus de son erreur standard standard, est connectée à l'entrée standard de command2 par le tuyau ; c'est un raccourci pour 2>&1 |. Cette redirection implicite de l'erreur standard erreur standard vers la sortie standard est effectuée après toute redirections spécifiées par la commande.