Keluaran buangan dari REPL

1

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?

Ankit Soni
sumber
2
Anda mungkin ingin melihat Expect
glenn jackman

Jawaban:

3

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 untuk sml. Sebaliknya, Anda memsmlecho - piping output ke perintah - di mana ia dibuang, karena echotidak menggunakan stdin.

  1. keyboard → sml file.smlecho -e "\004"→ layar

Upaya kedua Anda sml file.sml | sleep 2 ; echo -e "\004",, memiliki masalah yang sama - output smldikirim ke sleep(yang juga membuang input yang diterimanya). Namun, ada masalah lain: echoperintah sekarang bukan bagian dari pipa sama sekali; Anda bisa mengatakan bahwa |memiliki prioritas lebih tinggi daripada ;. (Anda dapat mengelompokkan perintah menggunakan tanda kurung ; mis a | (b; c; d).)

  1. keyboard → sml file.smlsleep 2→ layar
  2. keyboard → echo -e "\004"→ layar

Seperti yang sudah dikatakan di atas, kedua upaya ditulis ke arah yang salah . Jika Anda ingin mengirim \004karakter ke sml, pipa seharusnya ditulis seperti ini:

echo -e "\004" | sml file.sml

di mana, smlkeluarannya 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 -natau true, atau hanya mengarahkan input dari /dev/nullfile.

echo -n | sml file.sml

sml file.sml < /dev/null
grawity
sumber