Tại sao lệnh tương tác của kỳ vọng không hoạt động?


8

Tôi đang cố gắng tự động hóa gdb với mong đợi. Kịch bản của tôi sẽ bắt đầu gdb, thực hiện một số khởi tạo và sau đó chuyển điều khiển cho người dùng. interactLệnh của Expect dường như là công cụ hoàn hảo cho công việc.

Bây giờ hãy xem xét:

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -

Trên máy của tôi, scriptlet này sinh ra gdb, phát lệnh trợ giúp, như mong đợi. Nhưng sau đó nó ngay lập tức thoát khỏi tập lệnh và đưa tôi trở lại dấu nhắc bash. Tôi hy vọng người dùng sẽ ở trong gdb và có thể ra lệnh.

Bất cứ ý tưởng những gì tôi đang thiếu ở đây?


Bạn đang chạy trên Windows?
glenn jackman

Câu trả lời:


12

interactsẽ nhận được đầu vào của nó từ đầu vào expectstiêu chuẩn, đó là đường ống đến echobây giờ đã đóng.

Bạn có thể viết nó thay vào đó (cú pháp ksh / zsh / bash):

expect <(echo "spawn gdb
  expect \"(gdb) \"
  send \"help\r\"
  expect \"(gdb) \"
  interact" )

Điều đó vẫn được cho ăn qua một đường ống, nhưng lần này, đường ống được đưa ra như một đối số đường dẫn để expectstdin mong đợi không bị ảnh hưởng.

Trong trường hợp này, rõ ràng có thể viết nó sẽ là:

expect -c '
  spawn gdb
  expect "(gdb)"
  send "help\r"
  expect "(gdb) "
  interact'

expectthích shvà hầu hết các shell cho phép chuyển các tập lệnh nội tuyến với -c.

Nếu bạn vẫn cần truyền đầu ra của một lệnh (như echotrong trường hợp của bạn), bạn cũng có thể thực hiện nó -cvới:

expect -c "$(echo...)"

Tuy nhiên, điều đó có nghĩa là trái với các cách tiếp cận đường ống expectsẽ không bắt đầu cho đến khi lệnh đó kết thúc.

BTW, ở đây, bạn có thể sử dụng một .gdbinit tệp thay thế hoặc -ixtùy chọn gdb, bạn không thực sự cần expect.


Cảm ơn, nó thực sự có ý nghĩa hoàn toàn. Bạn có thể vui lòng xây dựng (hoặc chỉ vào tài liệu) về việc xây dựng <() không? Tôi không biết điều đó và thật khó để google!
Nicolas Bonefon

Ngoài ra, vâng tôi biết về -ix nhưng kịch bản thực sự của tôi phức tạp hơn nhiều và trong trường hợp này, tôi cần sự linh hoạt của sự mong đợi. Đề nghị tốt mặc dù.
Nicolas Bonefon

1
@NicolasBonnefon. Đó gọi là quá trình thay thế , một tính năng ksh. Rất nhiều câu hỏi và câu trả lời về nó trên U & L
Stéphane Chazelas

@NicolasBonnefon @ StéphaneChazelas Tôi đã có thể tránh thoát khỏi dấu ngoặc kép bằng cách sử dụng cấu trúcexpect <(cat <<- 'EOF' ... EOF )
Andreas

Tại sao lại phức tạp như vậy? tại sao không chỉ viết một tập lệnh `#! / usr / bin / wish -f``?
cas
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.