7

我是一名 C/C++ 程序员,而且总的来说非常愚蠢(或者至少 bash 做事的方式让我感到困惑)。我无法理解进程替换

我需要定义一个全局布尔值,将其设置在循环中的某个位置,并在全局范围内使用它。有人可以以最简单的方式解释如何调整下面的代码以允许我实现我的用例,足够简单,这样我明天就不必再次扭曲我的大脑来尝试掌握进程替换。

# DEFINE HERE

for i in `seq 0 ${DAEMON_COUNT}`;
do
        if [ ! -d "data$i" ]; then
# SET HERE
                echo "data$i does not exist. Creating...";
                mkdir data$i
        fi
done

# TEST AND USE HERE

老实说,我不认为 bash 能胜任任务....下一个块看起来像这样。

echo "-------------------------------------------------------------------------------"
echo "checking the state of potentially running daemons"
for i in `seq 0 ${DAEMON_COUNT}`;
do
        if [ ! -e "data$i/mongod.lock" ] ; then
                echo "[no lock file] mongod process $i does not exist"
        else
                echo "[lock file exists] process $i lock file exists "
                I_PID=`cat data$i/mongod.lock`

                if [ ! ${I_PID} ]; then
                        echo "    [GOOD] lock pid empty"
                elif [ "`ps -p ${I_PID} | grep ${I_PID}`" ]; then
                        echo "    [GOOD] data1 pid: ${I_PID} running"
                else 
                        echo "[PROBABLY FATAL] data1 pid: ${I_PID} not running."
                fi 
        fi
done
echo "-------------------------------------------------------------------------------"

我现在需要的是一个全局结构数组,这样我就可以遍历它们并采取条件操作来正确初始化我的守护进程:/。

可能只使用 libc 并在 lua 中做这些事情,我阻止的唯一原因是必须安装 Rocks,我不喜欢临时代码存储库在我的机器上吐出他们想要的任何东西:D

4

2 回答 2

9

要理解的重要一点是:子进程天生就有自己的环境,不能影响其父进程的变量。如果在子进程中设置变量,则父进程中的变量值不受影响。这些实际上是两个不同的变量,它们恰好具有相同的名称。

要了解的第二件事是 bash 何时将命令作为子进程运行。有两种情况与该问题相关:

  1. 通过管道连接的每个进程|都是当前 shell 的子进程。
  2. 运行带有重定向(例如<)的单个内置命令不会产生子进程。

这是一个演示这些想法的简单会话:

$ somevar=initial
$ echo test1 | read somevar
$ echo $somevar
initial
$ read somevar < <(echo test2)
$ echo $somevar
test2

第一个read是子进程,因此somevar在主 shell 中不会改变。第二个read由主 shell 本身执行,因此somevar被更新。

这意味着除非您在for循环之前或之后添加管道,否则您的代码将按预期工作,即按您的意愿工作:

# DEFINE HERE
SOMEVAR=0
DAEMON_COUNT=10

for i in `seq 0 ${DAEMON_COUNT}`;
do
        if [ ! -d "data$i" ]; then
# SET HERE
                SOMEVAR=10
                echo "data$i does not exist. Creating...";
                mkdir data$i
        fi
done

# TEST AND USE HERE
echo ${SOMEVAR}     # This displays 10
于 2012-01-26T01:31:42.697 回答
1

我可能误会了,但是...

bool=false;

for i in `seq 0 ${DAEMON_COUNT}`;
do
    if [ ! -d "data$i" ]; then
            bool=true;
            echo "data$i does not exist. Creating...";
            mkdir data$i
    fi
done

if [ $bool = true ]; then 
    ... 
fi

这是你想要的吗?

于 2012-01-26T01:30:56.193 回答