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でこれを行うだけかもしれませんが、私が差し控える唯一の理由は、ロックをインストールする必要があることです。アドホックコードリポジトリが自分のマシンに好きなものを吐き出すのは好きではありません:D

4

2 に答える 2

9

理解しておくべき重要なことは、子プロセスは独自の環境で生まれ、親の変数に影響を与えることができないということです。子プロセスで変数を設定しても、親の変数の値は影響を受けません。これらは、たまたま同じ名前を持つ 2 つの異なる変数です。

2 番目に理解しておくべきことは、bash がコマンドを子プロセスとして実行する場合です。質問に関連する 2 つのケースがあります。

  1. パイプで接続された各プロセス|は、現在のシェルの子です。
  2. リダイレクトを伴う単一の組み込みコマンド (例: <) を実行しても、子プロセスは生成されません。

これらのアイデアを示す簡単なセッションを次に示します。

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

1 つ目readは子プロセスであるためsomevar、メイン シェルでは変更されません。2 番目readは、メイン シェル自体によって実行されるため、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 に答える