回答:
必要がある
python -iそう:
python -i < p1
そして他の場所:
exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-
exec 3>&-と同じように機能しexec 3>&1ますか?
3>&-ここに書くつもりだったと思う。3>&1同様に機能しますが、ほとんど意味がありません。おかげで
書き込みtail -f後にfifoを開いたままにするために使用できますecho。
tail -n1 -f p1 | python
なぜこれが機能するのか
pythonはから読んでいp1ます。ファイルの最後に達すると、読み取りを停止します。これは、ファイルが名前付きパイプであっても、ファイルの読み取りの通常の動作です。tailで-f、その最後に到達した後(フォロー)フラグをファイルから読み続けます。
echo "print \"Hello World\" " > p1は2番目のターミナルで試しましたが、何も起こりませんでしたが、ターミナルもブロックされませんでした。pythonを備えた端末は、私が^cそれを終了するまでブロックされたままで、pythonによってキーボード割り込みメッセージが表示されてpythonを終了しました。
tail -f名前付きパイプを介してブロック分割tarアーカイブを解凍するときに、このトリックを使用しました。それは素晴らしく機能しました。
プログラム全体を一度に送信する必要があります。
runを呼び出すとpython < p1、シェルはpythonを呼び出す前に入力を待機します。つまり、Pythonは、データストリーム全体がシェルによって読み取られ、全体がに渡されるまで、実行を開始することすらありませんpython。
python -u p1代わりに実行しても(つまり、バッファリングされずにファイルから読み取られますp1)python、ファイルを実行する前にファイル全体を読み取ろうとします。
この実験を試してください。
ターミナル1:
mkfifo p1
python < p1
ターミナル2:
cat > p1
print "Hello World"
print "Hello World"
複数の行を送信できることがわかりますが、用語1のpythonは何もしません。次にctrl+を押しDます。プログラム全体が一度に実行されます。
つまり、要約すると、Pythonでパイプから読み取る場合は、プログラム全体を送信する必要があります。このように対話的にpythonを使用することはできません。
おそらく、テールアプローチの方が優れています(柔軟性が高い)が、代替策として:
{ echo -n "print \"Hello World\""; cat; } > p1
-n削除された可能性があります。そして、その後、0。echoコマンドを含むターミナルがブロックされます。1。pythonは^c、echoターミナルを押して両方のプロセスが終了するまでコマンドを実行しません。
exec 3> p1て&3&は何exec 3> &1ですか?ありがとうございました。