«Wait &» («wait esperluette») est-il un idiome ou une technique de script shell / shell (bash) utile?

12

J'ai «hérité» de certains scripts shell pour les machines Linux exécutant le shell GNU «bash». Dans un cas particulier, la machine exécute GNU bash version 2.0.5b

Un de ces scripts a une wait &instruction ("attente esperluette") dans le cadre de la ligne "for" d'une forboucle. À première vue, cela semble être un idiome curieux / intéressant, mais mes recherches sur le Web n'ont rien renvoyé de pertinent. man waitaffiche la page de manuel "BASH_BUILTINS" ("BASH BUILTINS COMMAND"), qui a la description suivante:

wait [n]  
  Wait for the specified process and return its termination status.
  n may be a process ID or a job spec­ification;  if  a  job spec is given,
  all processes in that job's pipeline are waited for.  If n is not
  given, all currently active child processes are waited for, and the 
  return status is zero. If n speci­fies a non-existent process or job, 
  the return status is 127.  Otherwise, the return status is the exit 
  status of the last process or job waited for.

En lisant cette partie de cette page de manuel, il me semble que wait &c'est en silence (en arrière-plan) de s'assurer que " tous les processus enfants actuellement actifs sont attendus et que le statut de retour est zéro ". Ai-je raison dans cette interprétation? Est-ce un idiome courant et / ou utile?

Pour plus de contexte, je parle du type d'utilisation suivant dans le script:

for file in `ls *.txt ; wait &`
do
   ...
   [cp instructions]
   ...
   [mv instructions]
   ...
   [mailx instruction]
done
ricmarques
la source

Réponses:

14

Je ne peux imaginer aucune raison d'écrire ce code, et je ne suis pas sûr de ce que la personne qui a écrit ce code essayait d'atteindre. waitici ne fait rien - de son point de vue, il n'y a pas de processus enfant, il sortira donc immédiatement et agira essentiellement comme un noop ( waits'exécute lui-même dans un processus enfant en raison de la substitution de commandes, mais ce n'est pas lié).

En passant, l' analyse de la sortie de ls est assez fragile . Au lieu de cela, envisagez simplement de faire ceci:

for file in *.txt; do
    ...
done
Chris Down
la source