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 memsml
echo
- piping output ke perintah - di mana ia dibuang, karena echo
tidak 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 sml
dikirim ke sleep
(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 ; 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 \004
karakter ke sml
, pipa seharusnya ditulis seperti ini:
echo -e "\004" | sml file.sml
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
atau true
, atau hanya mengarahkan input dari /dev/null
file.
echo -n | sml file.sml
sml file.sml < /dev/null