全局变量在Bash中没有变化

时间:2018-02-15 13:36:29

标签: python bash

我在使用以下代码时遇到问题。 runFail没有被更改,最后无法访问,导致错误。

False

它在结尾处返回1而不是0,并在到达代码时通过,告诉我它失败了。

runFail=1
pylint_run(){
if [ ! -f "$root/$1/$2/__init__.py" ]; then
    cd "$root/$1/$2" || exit
    pylintOutput=$(find . -iname "*.py" -print0 | xargs -0 pylint)
else
    pylintOutput=$(pylint "$root/$1/$2")
fi

echo "${pylintOutput}"
# This then scans for the line in the output containing the score
scoreLine=$(grep rated <<< "$pylintOutput")
IFS=" " read -r -a array <<< "$scoreLine"
# The score is the 6th column in that line
scoreVal=${array[6]}
# Snips the "out of ten" of the end
scoreVal=${scoreVal///10/}
# Sees if the pylint actually ran successfully and produced a score
if [ -z "$scoreVal" ]; then
    echo "Pylint failed to run"
    runFail=0
fi
# Checks if the score is good enough
# If not, it will say the score is too low and indicate a fail.
if (( $(echo "$scoreVal < 8" | bc -l) )); then
    echo "Score is less than 8 for '$2': FAIL"
    runFail=0
fi
echo "=================END OF TEST================"
}
# pylint_run [path/containing/scriptFolder] [scriptFolder]
# The tee command is then used to produce a report to be used as an 
artifact
pylint_run "gocd-helper-scripts/gocdhelp/" "gocdhelp" | tee gocdhelp-
report.txt
pylint_run "metrics-gocd/" "metrics" | tee metrics-report.txt
echo $runFail
if [[ $runFail = 1 ]]; then
    echo "Score is more than 8 for each tool: PASS"
    exit 0
else
    exit 1
fi

此处echo应打印0(当前打印1),因此应退出1.

如果您需要更多详细信息,请告诉我,我很困惑,并且问同事我的代码是什么我不知道,因为我在尝试同样的事情一个bash shell,它工作正常。

实际上,我所做的只是设置变量,创建一个函数来更改该变量,调用该函数并测试变量是否已更改。它显然可以改变变量,但却无法全局更改变量,即使它应该没问题。

与此类似:Value of global variable doesn't change in BASH

从功能运行中移除T形管解决了这个问题,但我很困惑为什么管道会以这种方式影响范围。

Bash版本是3.2.57,我在终端&#34; ./ pylint-checker.sh&#34;

中运行

2 个答案:

答案 0 :(得分:1)

你在管道中调用你的函数:

pylint_run "gocd-helper-scripts/gocdhelp/" "gocdhelp" | tee gocdhelp-report.txt

这意味着双方都在子shell中运行。 Subshel​​l无法更改父环境的值,因此调用此方式的pylint_run无法更改全局变量。

您可以使用重定向来实现相同的效果,而无需pylint_run过程的子shell,例如

pylint_run "gocd-helper-scripts/gocdhelp/" "gocdhelp" > >(tee gocdhelp-report.txt)

在进程替换shell中运行tee并在父shell中保留pylint_run,以便它可以修改这些变量。

答案 1 :(得分:0)

我正在使用

| tee filename.txt

我需要使用

> >(tee filename.txt)