Порядок выполнения подоболочек? - PullRequest
0 голосов
/ 31 августа 2018

Пытаясь решить другие проблемы, я встретил следующий сценарий bash в ответе Алекса Б. на этот вопрос :

#!/bin/bash

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200 || exit 1

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

У меня проблемы с пониманием этого сценария. Согласно инструкции flock's, дескриптор файла (200) в flock -x -w 10 200 должен относиться к открытому файлу.

Где этот дескриптор / файл открыт? Если это 200>/var/lock/.myscript.exclusivelock, который открывает дескриптор, это будет означать, что эта часть выполняется до подоболочки, что противоположно тому, что я думал, когда я первоначально смотрел на этот скрипт.

Это подводит меня к моему вопросу: каков порядок выполнения подоболочек в bash по отношению к основному сценарию (т. Е. К сценарию, открывающему подоболочки), а также по отношению к другим подоболочкам, которые может вызывать тот же основной сценарий?

Из прочтения других статей и руководства по bash я полагаю, что я только узнал, что подоболочки выполняются «одновременно», но я не видел ни одного утверждения, объясняющего, есть ли исключения из этого (одно очевидное исключение было бы, когда основной сценарию потребуется вывод подоболочки, например echo foo $(cat bar)).

1 Ответ

0 голосов
/ 31 августа 2018

200>, оператор перенаправления, открывает файл, используя дескриптор 200. Он действительно обрабатывается до подоболочки. Этот дескриптор файла затем наследуется подоболочкой.

В подоболочках нет ничего параллельного. Возможно, вы думаете о конвейерах , например a | b | c, где a, b и c - все команды, которые выполняются одновременно. Тот факт, что каждый из них запускается в подоболочке (обычно это собственный подпроцесс, если они являются внешними командами, но даже встроенные средства оболочки выполняются в подоболочке), является подробностью реализации конвейера.


Для уточнения,

  1. Сначала оболочка анализирует эту команду. Он идентифицирует сложную команду (...) с перенаправлением вывода.

  2. Открывается /var/lock/.myscript.exclusivelock в режиме записи по файловому дескриптору 200.

  3. Выполняет подоболочку, которая наследует все открытые дескрипторы файлов, включая 200.

  4. В подоболочке он выполняет flock, который наследует все дескрипторы открытых файлов от его родителя, подоболочки. Он делает свое дело в файловом дескрипторе 200, как того требует его аргумент.

  5. После выхода из подоболочки любой файл, открытый одним из операторов перенаправления, закрывается оболочкой.

...