Apa yang saya coba lakukan adalah menjalankan python di jendela terminal dan mengarahkan stdin dari pipa bernama. Lalu saya menulis ke pipa bernama di terminal lain dan meminta perintah itu mengeksekusi pada python.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
Yang terjadi adalah - cetakan Hello World
dan keluar python . Yang ingin saya lakukan adalah tetap menjalankan python untuk mengambil perintah berikutnya. Bagaimana saya melakukan ini di shell?
exec 3> p1
dilakukan dan apa itu&3
&exec 3> &1
? Terima kasih.exec 3>&-
berfungsi sama seperti diexec 3>&1
sini?3>&-
sini.3>&1
akan bekerja dengan baik tetapi tidak masuk akal. Terima kasihAnda dapat menggunakannya
tail -f
untuk menjaga fifo tetap terbuka setelahecho
menulisnya.Kenapa ini bekerja?
python
sedang membaca darip1
. Ketika mencapai akhir file, itu berhenti membaca. Ini adalah perilaku normal untuk membaca file, bahkan jika file tersebut adalah pipa bernama.tail
dengan-f
bendera (ikuti) akan terus membaca dari file setelah akhirnya tercapai.sumber
echo "print \"Hello World\" " > p1
di terminal kedua dan tidak ada yang terjadi - tetapi terminal juga tidak diblokir. Terminal dengan python tetap diblokir sampai saya^c
dan keluar dan mengakhiri python dengan pesan interupsi keyboard yang ditampilkan oleh python.tail -f
trik ini ketika membongkar arsip tar blok-split melalui pipa bernama. Itu bekerja dengan sangat baik.Anda harus mengirim seluruh program sekaligus.
Ketika Anda menelepon jalankan
python < p1
shell sedang menunggu input sebelum memanggil python. Artinya, python bahkan tidak mulai menjalankan sama sekali sampai seluruh aliran data telah dibaca oleh shell dan kemudian diteruskan secara keseluruhan kepython
.Bahkan menjalankan
python -u p1
sebaliknya (yaitu, unbuffered dan membaca dari filep1
)python
akan mencoba membaca seluruh file sebelum mengeksekusi semua itu.Coba percobaan ini.
Terminal 1:
Terminal 2:
Anda akan melihat bahwa Anda dapat mengirim banyak baris tetapi python dalam Term 1 tidak melakukan apa-apa. Sekarang tekan ctrl+ D. Seluruh program dijalankan sekaligus.
Jadi, untuk meringkas, jika Anda ingin python membaca dari sebuah pipa, Anda harus mengirim seluruh program. Anda tidak dapat menggunakan python secara interaktif dengan cara ini.
sumber
Mungkin pendekatan ekor lebih baik (lebih fleksibel) tetapi sebagai alternatif:
sumber
-n
mungkin telah dihapus. Dan setelah itu, 0. terminal denganecho
perintah akan diblokir 1. python tidak mengeksekusi perintah sampai aku menekan^c
diecho
terminal dan kedua proses mengakhiri.