前回の続き。
シェルの醍醐味(?)といえばパイプ処理。
実際のところ
output=`dmesg | grep hda`
に相当するコマンドが、以下の様に。
p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) #入力はp1のstdout p1.stdout.close() # 他のプロセスがあったとき、p1がSIGPIPEを掴めるようにする。 output = p2.communicate()[0]
……なんか可読性が低いような気がしないでもないですが、
移植性を高めるためにやむなしって感じなんですかね??
シグナル関係は不勉強もいいとこなのですが、
どうもSIGPIPEシグナル*1は結構悪さをするケースがあるようですね。
第6回 UNIXプログラミングの勘所(3):Perl Hackers Hub|gihyo.jp … 技術評論社
*1:閉じてたり、そもそも存在しないパイプやソケットに書き込みしようとした