БАШ местный и стадный

Я пытаюсь использовать стадо, как здесь /questions/6331435/byistryij-i-gryaznyij-sposob-garantirovat-chto-odnovremenno-rabotaet-tolko-odin-ekzemplyar-stsenariya-obolochki/6331457#6331457 но внутри функции... и я пытаюсь обновить локальную переменную (локаль для функции) изнутри части стада, но, похоже, нет Обновить...

кошка test.sh

#!/bin/bash

function _job_worker()
{
        local z=1
        local result=


        (
                # Wait for lock on /var/lock/.manager.exclusivelock (fd 200)
                flock -x -w 10 200 || return

                z=2
                echo "slot equal $z"

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

        echo "slot equal $z"

}

_job_worker

./test.sh

slot equal 2
slot equal 1

какого чёрта я делаю не так....

1 ответ

Решение

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

использование { а также } вместо этого, чтобы создать блок с переадресацией по области, работающей внутри одной оболочки, а не запускать подоболочку.

То есть:

_job_worker() {
        local z=1 result=
        {
                # Wait for lock on /var/lock/.manager.exclusivelock (fd 200)
                flock -x -w 10 200 || return
                z=2
                echo "slot equal $z"
        } 200>.manager.exclusivelock
        echo "slot equal $z"
}

_job_worker
Другие вопросы по тегам