Как exe c и flock работают вместе в bash скрипте - PullRequest
0 голосов
/ 28 марта 2020

Bash Скрипт:

#!/bin/bash
...
exec {LOCK} > foo.out
flock -x ${LOCK}
...

Я понимаю, что exe c без аргумента просто перенаправляет весь вывод текущей оболочки в файл foo.out. Вопросы:

  1. Что означает первый аргумент для exe c {LOCK}, учитывая, что он, кажется, имеет особое значение, поскольку он заключен в фигурные скобки (но не в $ {. ..}).

  2. Каково значение $ {LOCK} и откуда оно появилось (я не думаю, что я определил эту переменную)?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Это недействительно или полезно bash. Это просто приведет к двум различным сообщениям об ошибках.

Вместо этого предполагаемый код был следующим:

#!/bin/bash
...
exec {LOCK}> foo.out
flock -x ${LOCK}
...

. Для открытия используется:

  1. {name}> для записи и присвоения номера fd name
  2. exec, чтобы применить перенаправление к току, оставив открытым fd на время действия оболочки
  3. flock для блокировки назначенного fd, который он унаследует от текущей оболочки

Таким образом, он эффективно создает мьютекс на основе файла foo.out, гарантируя, что только один экземпляр может запускать вещи после flock в время. Любые другие экземпляры будут ждать до завершения предыдущего.

0 голосов
/ 28 марта 2020

Вот что я наконец понял:

exec {LOCK}> foo.out меняет стандартный вывод текущей оболочки на файл foo.out. Для открытого файла задается переменная $ {LOCK}. Установка fd для переменной {LOCK} является функцией bash.

flock -x ${LOCK} - это просто блокировка с использованием файлового дескриптора.

...