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.
- keyboard →
sml file.sml→ echo -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).)
- keyboard →
sml file.sml→ sleep 2→ layar
- 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