「python --version」の複数のファイルを追加するリダイレクトの1つはbashによって繰り返し「無視」されますが、他のものは[閉じられていません]。

「python --version」の複数のファイルを追加するリダイレクトの1つはbashによって繰り返し「無視」されますが、他のものは[閉じられていません]。

bash特定のリダイレクトされた出力が常にpython --versionファイルに追加されるのではなく、コンソールから渡されますが、他のすべての出力が正しくリダイレ​​クトされるのはなぜですか?

numpy、、、およびに依存するscipyPythonパッケージを開発しており、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送信されていましたが、stderrv3.4.0以降ではこの出力がに送信されましたstdout

出力ファイルにリダイレクトするとうまくstdout機能します。stderr

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

関連情報