Bash变量不会持续存在

Dic*_*edy 0 variables bash

我有一个简短的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
Run Code Online (Sandbox Code Playgroud)

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

RUNNING: 1
Running: 0
Run Code Online (Sandbox Code Playgroud)

并且bash脚本的退出值为0.因此isRunning在所有if语句中都会发生变化(即代码按预期执行),但之后某种程度上运行会再次恢复为0.困惑...

cho*_*oba 6

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

解决方案:将循环更改为

while read PID; do
    # ...
done < $PIDFILE
Run Code Online (Sandbox Code Playgroud)