Czy „wait &” („wait ampersand”) to przydatny idiom lub technika skryptu powłoki / powłoki?

12

„Odziedziczyłem” niektóre skrypty powłoki dla maszyn z systemem Linux, na których działa powłoka „bash” GNU. W jednym szczególnym przypadku na maszynie działa GNU bash w wersji 2.0.5b

Jeden z tych skryptów ma wait &instrukcję („czek ampersand”) jako część „for line” forpętli. Na pierwszy rzut oka wydaje się to dziwnym / ciekawym idiomem, ale moje wyszukiwania w sieci nie zwróciły niczego istotnego. man waitpokazuje stronę podręczną „BASH_BUILTINS” („BASH BUILTINS COMMAND”), która ma następujący opis:

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.

Czytając tę ​​część tej strony, wydaje mi się, że wait &po cichu (w tle) upewnia się, że „ wszystkie aktualnie aktywne procesy potomne są oczekiwane, a zwracany status wynosi zero ”. Czy mam rację w tej interpretacji? Czy to powszechny i ​​/ lub użyteczny idiom?

Dla dodatkowego kontekstu mówię o następującym sposobie użycia w skrypcie:

for file in `ls *.txt ; wait &`
do
   ...
   [cp instructions]
   ...
   [mv instructions]
   ...
   [mailx instruction]
done
Ricmarques
źródło

Odpowiedzi:

14

Nie wyobrażam sobie żadnego powodu do napisania tego kodu i nie jestem do końca pewien, co próbowała osiągnąć osoba, która napisała ten kod. waittu nic nie robi - z jego punktu widzenia, nie żadne procesy potomne, więc będzie po prostu wyjść bezpośrednio i zasadniczo działać jako noop ( waitSam wykonuje się w procesie potomnym powodu zastąpienia poleceń, ale to bez związku).

Nawiasem mówiąc , parsowanie wyjścia ls jest dość kruche . Zamiast tego rozważ zrobienie tego:

for file in *.txt; do
    ...
done
Chris Down
źródło