Kết xuất đầu ra từ REPL


1

Tôi đang viết các chương trình SML và tôi muốn một cách nhanh chóng thấy đầu ra từ việc chạy một chương trình trong REPL mà không thực sự chạy REPL (để nhanh chóng xem chương trình có lỗi cú pháp hay không - tôi dự định sử dụng nó như một cách thực hiện chương trình cho các tệp .sml trong vim để xem đầu ra bên trong vim) .. Hiện tại, tôi có cái này:

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

Vì vậy, nó chạy chương trình, và sau đó lặp lại Ctrl-D để thoát REPL. Vấn đề là quá nhanh để gửi phím Ctrl-D, do đó không có đầu ra. Tôi cũng đã thử điều này:

sml file.sml | sleep 2 ; echo -e "\004"

Nhưng điều đó cũng không làm điều đó. Có ý tưởng nào về cách tôi có thể nhận được kết xuất đầu ra từ REPL không?


2
Bạn có thể đi lang thang để xem Expect
glenn jackman

Câu trả lời:


3

Không, vấn đề là bạn đang hiểu sai về cách thức hoạt động của đường ống.

Trong các đường ống Unix, dữ liệu chảy từ trái sang phải (cùng hướng với văn bản bằng tiếng Anh) - đầu ra của chương trình đầu tiên trở thành đầu vào của chương trình thứ hai. Nhưng các đường ống là đơn hướng; đầu ra của chương trình thứ hai không được gửi đến chương trình đầu tiên.

Khi bạn chạy sml file.sml | echo -e "\004", bạn không lặp lại Ctrl + D đến sml. Thay vào đó, bạn đang chuyển smlđầu ra của echolệnh tới lệnh - nơi nó bị loại bỏ, vì echokhông sử dụng stdin.

  1. bàn phím → sml file.smlecho -e "\004"→ màn hình

Nỗ lực thứ hai của bạn sml file.sml | sleep 2 ; echo -e "\004", có một vấn đề tương tự - đầu ra của smlđược gửi đến sleep(cũng loại bỏ đầu vào mà nó nhận được). Tuy nhiên, có một vấn đề khác: echolệnh bây giờ không phải là một phần của đường ống; bạn có thể nói rằng |có một ưu tiên cao hơn ;. (Bạn có thể nhóm các lệnh bằng cách sử dụng dấu ngoặc đơn ; vd a | (b; c; d).)

  1. bàn phím → sml file.smlsleep 2→ màn hình
  2. bàn phím → echo -e "\004"→ màn hình

Như đã nói ở trên, cả hai lần thử đều được viết sai hướng . Nếu bạn muốn gửi \004nhân vật đến sml, đường ống nên được viết như thế này:

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

trong đó, smlđầu ra của nó đi đến màn hình, nơi nó nên.

một vấn đề khác , tuy nhiên. Bạn cũng đang nhầm lẫn giữa CtrlDphím nhấn với sự kiện "kết thúc đầu vào" .

Việc dịch CtrlDthành "kết thúc đầu vào" chỉ xảy ra ở lớp thiết bị đầu cuối - nói cách khác, chỉ khi bạn nhập ký tự Ctrl + D vào cửa sổ đầu cuối. Tuy nhiên, khi bạn sử dụng echo -e "\004"trong một đường ống, nó không được dịch tự động thành "kết thúc đầu vào"; thay vào đó, byte thực tế 004 [bát phân] được viết.

Nếu bạn thực sự muốn nói với chương trình rằng không còn đầu vào nữa, thì đừng viết gì cả . Sử dụng một lệnh kết quả đầu ra không có gì - ví dụ, echo -nhoặc true, hoặc chỉ cần chuyển hướng đầu vào từ các /dev/nulltập tin.

echo -n | sml file.sml

sml file.sml < /dev/null
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.