Saya sedang menulis program SML, dan saya ingin cara cepat melihat output dari menjalankan program di REPL tanpa benar-benar menjalankan REPL (untuk dengan cepat melihat apakah suatu program memiliki kesalahan sintaksis - saya berencana untuk menggunakan ini sebagai make program untuk file .sml dalam vim untuk melihat output di dalam vim) .. Saat ini, saya punya ini:
sml file.sml | echo -e "\004"
Jadi ia menjalankan program, dan kemudian mengulangi Ctrl-D untuk keluar dari REPL. Masalahnya adalah terlalu cepat untuk mengirim kunci Ctrl-D, jadi tidak ada output. Saya mencoba ini juga:
sml file.sml | sleep 2 ; echo -e "\004"
Tapi itu juga tidak berhasil. Adakah ide tentang bagaimana saya bisa mendapatkan dump dari output dari REPL?
Jawaban:
Tidak, masalahnya adalah Anda salah paham tentang cara kerja pipa.
Dalam pipa Unix, data mengalir dari kiri ke kanan (arah yang sama dengan teks tertulis dalam bahasa Inggris) - output program pertama menjadi input program kedua. Tapi pipa itu searah; output program kedua tidak dikirim ke program pertama.
Ketika Anda menjalankan
sml file.sml | echo -e "\004"
, Anda tidak bergema Ctrl + D untuksml
. Sebaliknya, Anda memsml
echo
- piping output ke perintah - di mana ia dibuang, karenaecho
tidak menggunakan stdin.sml file.sml
→echo -e "\004"
→ layarUpaya kedua Anda
sml file.sml | sleep 2 ; echo -e "\004"
,, memiliki masalah yang sama - outputsml
dikirim kesleep
(yang juga membuang input yang diterimanya). Namun, ada masalah lain:echo
perintah sekarang bukan bagian dari pipa sama sekali; Anda bisa mengatakan bahwa|
memiliki prioritas lebih tinggi daripada;
. (Anda dapat mengelompokkan perintah menggunakan tanda kurung ; misa | (b; c; d)
.)sml file.sml
→sleep 2
→ layarecho -e "\004"
→ layarSeperti yang sudah dikatakan di atas, kedua upaya ditulis ke arah yang salah . Jika Anda ingin mengirim
\004
karakter kesml
, pipa seharusnya ditulis seperti ini:di mana,
sml
keluarannya masuk ke layar, di mana seharusnya.Namun ada masalah lain . Anda juga mengacaukan CtrlDpenekanan tombol dengan acara "end of input" .
Terjemahan CtrlDmenjadi "akhir input" hanya terjadi pada lapisan perangkat terminal - dengan kata lain, hanya ketika Anda memasukkan karakter Ctrl + D ke jendela terminal Anda. Namun, ketika Anda menggunakan
echo -e "\004"
pipa, itu tidak diterjemahkan secara otomatis ke "end of input"; alih-alih, byte aktual 004 [oktal] ditulis.Jika Anda benar-benar ingin memberi tahu program bahwa tidak ada lagi input, maka jangan menulis apa pun . Gunakan perintah yang tidak menghasilkan apa-apa - misalnya,
echo -n
atautrue
, atau hanya mengarahkan input dari/dev/null
file.sumber