Является ли «wait &» («ждать амперсанд») полезной (bash) оболочкой / сценарием оболочки идиома или техникой?


12

Я «унаследовал» некоторые сценарии оболочки для машин Linux, работающих под оболочкой GNU «bash». В одном конкретном случае на машине работает GNU bash версии 2.0.5b

В одном из этих сценариев есть wait &инструкция («ждать амперсанд») как часть цикла «for line» for. На первый взгляд, это кажется любопытной / интересной идиомой, но мои поиски в сети не дали ничего уместного. man waitпоказывает справочную страницу "BASH_BUILTINS" ("BASH BUILTINS COMMAND"), которая имеет следующее описание:

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.

Читая эту часть этой man-страницы, мне кажется, что wait &она молча (в фоновом режиме) проверяет, что « все текущие активные дочерние процессы ожидаются, а статус возврата равен нулю ». Прав ли я в этой интерпретации? Это распространенная и / или полезная идиома?

Для дополнительного контекста я говорю о следующем виде использования в скрипте:

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

Ответы:


14

Я не могу себе представить причину написания этого кода, и я не совсем уверен, чего пытался достичь тот, кто написал этот код. waitздесь ничего не делает - с его точки зрения, есть не нет дочерних процессов, так что это будет просто выйти немедленно , и в основном выступают в качестве Ноопа ( waitсама выполняется в дочернем процессе из - за подстановки команд, но это не связано).

Кроме того, парсинг вывода ls довольно хрупок . Вместо этого рассмотрите просто сделать это:

for file in *.txt; do
    ...
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.