【问题标题】:BASH local and flockBASH 本地和羊群
【发布时间】:2014-08-14 15:09:40
【问题描述】:

我尝试使用像这里这样的羊群https://stackoverflow.com/a/169969 但是在一个函数中......我尝试从flock部分更新一个局部变量(函数的语言环境),但它似乎没有更新......

猫测试.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

我到底做错了什么......

【问题讨论】:

  • 仅供参考,您不需要 function 关键字——它使您的脚本与 POSIX sh 不兼容,但这样做不会带来任何好处。
  • 你是对的,谢谢指出!
  • 当然,使用local也会使代码与POSIX不兼容,但至少增加了一些价值。

标签: bash local flock


【解决方案1】:

() 创建一个子外壳。这是一个独立的进程,有它自己的变量和状态——它不仅是不逃避子 shell 的本地变量,还有全局变量、文件句柄更改、当前目录更改以及(几乎)其他所有内容。

改用{} 创建一个块,其范围内的重定向在同一个shell 中运行,而不是启动一个子shell。

即:

_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

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2012-12-30
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多