![「python --version」の複数のファイルを追加するリダイレクトの1つはbashによって繰り返し「無視」されますが、他のものは[閉じられていません]。](https://linux33.com/image/9258/%E3%80%8Cpython%20--version%E3%80%8D%E3%81%AE%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%AE1%E3%81%A4%E3%81%AFbash%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%80%8C%E7%84%A1%E8%A6%96%E3%80%8D%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E4%BB%96%E3%81%AE%E3%82%82%E3%81%AE%E3%81%AF%5B%E9%96%89%E3%81%98%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%5D%E3%80%82.png)
bash
特定のリダイレクトされた出力が常にpython --version
ファイルに追加されるのではなく、コンソールから渡されますが、他のすべての出力が正しくリダイレクトされるのはなぜですか?
numpy
、、、およびに依存するscipy
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