“python --version”的几个文件附加重定向之一被 bash 重复“忽略”,但其他的则没有

“python --version”的几个文件附加重定向之一被 bash 重复“忽略”,但其他的则没有

为什么bash始终将一个特定的重定向输出从python --version控制台传递而不是附加到文件,而其他所有输出都正确重定向?

我正在开发一个依赖于numpyscipy、 和的 Python 包h5py,并且想要进行一些设置,以便我可以在这些依赖项的不同版本的各种组合上自动运行我的测试套件(类似于“本地 CI”实现)。我用来virtualenv为每个版本组合创建不同的文件夹,所有文件夹都带有前缀env

$ ls -1d env*

env-p3.3.6n1.7.0s0.12.0h2.3.1
env-p3.4.0n1.7.0s0.12.0h2.4.0
env-p3.4.4n1.7.0s0.12.0h2.3.1
env-p3.4.4n1.7.0s0.12.0h2.5.0
env-p3.5.1n1.11.0s0.12.0h2.6.0
env-p3.5.1n1.11.0s0.12.1h2.6.0
env-p3.5.1n1.11.0s0.13.0h2.6.0

在大多数情况下,以下testall脚本运行良好:

#!/bin/bash

# Store the filename
fname=testresults

# Overwrite the test result file with the date/time
date > $fname
echo -e "\n" >> $fname

# Pull all the env folders in the loop
for fld in $( ls -1 | grep -E "^env" )
do
   # Activate the virtualenv
   source $fld/bin/activate

   # Informative header
   echo "=============================" >> $fname
   echo $fld >> $fname
   python --version >> $fname
   pip freeze | grep -E '^(h5py|numpy|scipy)' >> $fname
   #echo -e "\n" >> $fname

   # Run the tests, dumped to file
   cd opan
   python tests.py --all 2>> ../$fname
   cd ..
   echo -e "\n" >> $fname

   # Leave the virtualenv
   deactivate

done

然而,它表现出了一个小而烦人的错误行为:第一个调用的输出python --version >> $fname被发送到控制台,而所有其他调用都毫无问题地重定向到文件:

$./testall
Python 3.3.6
$ head -n28 testresults
Mon Jun 20 11:07:45 EDT 2016


=============================
env-p3.3.6n1.7.0s0.12.0h2.3.1
h5py==2.3.1                      <=== Python version is missing
numpy==1.7.0
scipy==0.12.0
...........................................................................................................................................................................................................................................................................................................................
----------------------------------------------------------------------
Ran 315 tests in 3.254s

OK


=============================
env-p3.4.0n1.7.0s0.12.0h2.4.0
Python 3.4.0
h5py==2.4.0
numpy==1.7.0
scipy==0.12.0
...........................................................................................................................................................................................................................................................................................................................
----------------------------------------------------------------------
Ran 315 tests in 3.230s

OK

这里发生了什么?我怎样才能解决这个问题?

答案1

发生这种情况是因为 v3.3.6 的输出是stderr,而不是stdout

显然,在 v3.4.0 之前,来自的输出python --version被发送到stderr,而在 v3.4.0 及更高版本中,此输出被发送到stdout

stdout和重定向stderr到输出文件效果很好:

python --version >> $fname 2>&1

相关内容