2

ファイル a.sh とファイル b.sh の 2 つの bash ファイルがあります。

ファイル a.sh の内容

# !/bin/bash
(/root/b.sh) & # <--- must be run in the background!!!
sleep 1
echo "--${VAR}--"

ファイル b.sh の内容

# !/bin/bash
VAR=100

スクリプト /root/a.sh を実行すると、結果は次のようになります: ----

結果が --100-- でないのはなぜですか?

4

2 に答える 2

3

サブプロセス (サブシェル、バックグラウンド スクリプトなど) の環境変数への変更は、親プロセスには反映されません。つまり、実行されるシェル プロセスa.shには環境変数の独自のコピーがあり、実行されるシェル プロセスにはb.sh独自の完全に別のコピーがありVAR、"b" シェルで変更しても、"シェル。

値 100 を「a」シェルに戻すには、それを標準出力に出力して で読み取るa.shか、プロセス間通信の他の方法を使用する必要があります。

于 2013-03-29T02:23:18.527 に答える
1

こんにちは、最も簡単な方法は一時ファイルを使用することです。次の例を試してください。

# !/bin/bash

ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SCRIPT_FILE="$ROOT_DIR/b.sh"

$SHELL $SCRIPT_FILE &
SCRIPT_PID=$!
TEMP_FILE="/tmp/$SCRIPT_PID.data"

# kill child process on exit
trap cleanup EXIT INT TERM
cleanup() {
  kill $SCRIPT_PID
  exit $?
}

# wait child process to put data
waitdata() {
  while [ ! -f $TEMP_FILE ]
  do
    sleep 1
  done
}

# main loop
while :
do
    waitdata
    VAR=$(cat $TEMP_FILE)
    echo $VAR
    sleep 2
done

b.sh

#!/bin/bash

# my pid
TEMP_FILE="/tmp/$$.data"

# trap (control-c, kill, etc)
trap cleanup EXIT INT TERM
cleanup() {
  rm -f $TEMP_FILE
  exit $?
}

# main loop
while :
do
    VAR=$(date)
    #echo $VAR
    echo $VAR > $TEMP_FILE
    sleep 2
done


これが役立つことを願っています:)

于 2013-03-29T14:23:07.570 に答える