Bash变量不会持续存在

时间:2012-11-05 13:49:16

标签: bash variables

我有一个简短的bash脚本来检查Python程序是否正在运行。程序在运行时写出一个PID文件,因此将其与当前正在运行的进程列表进行比较可以得到我所需要的。但是我有一个变量被改变然后显然会改变的问题!这是脚本:

#!/bin/bash
# Test whether Home Server is currently running
PIDFILE=/tmp/montSvr.pid
isRunning=0
# does a pid file exist?
if [ -f "$PIDFILE" ]; then
  # pid file exists
  # now get contents of pid file
  cat $PIDFILE | while read PID; do
    if [ $PID != "" ]; then
      PSGREP=$(ps -A | grep $PID | awk '{print $1}')
      if [ -n "$PSGREP" ]; then
        isRunning=1
        echo "RUNNING: $isRunning"
      fi
    fi
  done
fi
echo "Running: $isRunning"
exit $isRunning

当Python脚本 运行时,我得到的输出是:

RUNNING: 1
Running: 0

并且bash脚本的退出值为0.因此isRunning在所有if语句中都会发生更改(即代码按预期执行),但是然后以某种方式isRunning再次恢复为0。困惑...

2 个答案:

答案 0 :(得分:6)

管道|之后的命令在子shell中运行。对子shell中变量值的更改不会传播到父shell。

解决方案:将循环更改为

while read PID; do
    # ...
done < $PIDFILE

答案 1 :(得分:0)

管道就是问题所在。以这种方式使用管道意味着循环在子shell中运行,具有自己的环境。杀死cat,请改用此语法:

while read PID; do
    if [ $PID != "" ]; then
      PSGREP=$(ps -A | grep $PID | awk '{print $1}')
      if [ -n "$PSGREP" ]; then
        isRunning=1
        echo "RUNNING: $isRunning"
      fi
    fi
  done < "$PIDFILE"