2

我有 2 个 bash 文件,文件 a.sh 和文件 b.sh。

文件 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

对子进程(子shell、后台脚本等)中环境变量的更改不会传播回父进程。换句话说,运行的shell进程a.sh有自己的环境变量副本,运行的shell进程b.sh有自己完全独立的副本,当你VAR在"b" shell中改变时,它不会改变"如地狱。

要将值 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 回答