Gửi tổ hợp phím mô phỏng trong Bash


19

Gần đây tôi đã cố gắng viết một tập lệnh có thể được sử dụng để tự động hóa chương trình c ++ của tôi trong bash. Nếu bạn biết AutoIt, tôi chỉ có thể chỉ cho bạn một ví dụ về những gì tôi đang cố gắng thực hiện:

send("1{enter}")

hoặc là

send("!a")

OK cho những người không nói AutoIt:

Ví dụ đầu tiên gửi tổ hợp phím "1" mô phỏng theo sau là một phím nhập (CR)

Ví dụ thứ hai gửi alt-a

Tôi đặc biệt đang cố gắng làm điều này trong bash . Không có ngôn ngữ kịch bản khác sẽ làm

Ngoài ra, tôi sẽ không thích một muỗng ăn. Vui lòng ghi rõ cách viết . Không được viết kịch bản cho tôi được cho phép.


1
Bạn đang tự động hóa một dòng lệnh, ncurses hoặc chương trình đồ họa?
dùng1686

1
Bây giờ tôi đang tự động hóa một dòng lệnh. Nó được cho là tự động đưa đầu vào vào cin (đầu vào bảng điều khiển)
Ishan

Câu trả lời:


16

Để đưa văn bản vào stdin của chương trình, hãy sử dụng đường ống và / hoặc chuyển hướng :

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

Trong trường hợp các chương trình CLI tương tác ( không phải là thiết bị đầu cuối đầy đủ), có thể sử dụng các đường ống hoặc bộ xử lý có tên như một loại người nghèo expect(mà bạn đã loại trừ do là Tcl):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(Hãy cẩn thận khi đọc từ ống đầu ra; ví dụ: head -1 <outsẽ không chỉ đọc một dòng - nó sẽ đệm một khối 4k đầy đủ, in một dòng, loại bỏ phần còn lại.)


Cả hai câu trả lời đều tốt như nhau. Nhưng, đây là những gì tôi muốn tìm kiếm nhiều hơn.
Ishan

Chương trình CLI / thiết bị đầu cuối đầy đủ có nghĩa là gì?
Chris Stryczynski

CLI là viết tắt của Giao diện dòng lệnh. Chương trình CLI là một chương trình đơn giản chạy trên dòng lệnh và thường sử dụng stdin và stdout khi nó thực hiện một số tác vụ và sau đó kết thúc thực hiện và trở về dấu nhắc dòng lệnh. grepcurllà những ví dụ tốt về điều này. Một chương trình thiết bị đầu cuối đầy đủ là một cái gì đó kiểm soát toàn bộ cửa sổ, như vimscreen.
Trevin Avery

16

Bạn đang tìm xdotool .

xdotool tương đương với các lệnh ví dụ của bạn là:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

điều này là tốt nhưng tôi đã suy nghĩ về một số mã bash thuần túy
Ishan

9
@I Sơn: Thực tế không thể làm những việc như vậy với mã bash thuần túy . Bash không thể sử dụng trực tiếp X11 và nó cũng không thể sử dụng bất kỳ thư viện X11 nào. Bạn sẽ phải kết nối trực tiếp với ổ cắm X11 (bash chỉ có TCP, không phải ổ cắm Unix), phân tích giao thức X11 bằng tay (phân tích dữ liệu nhị phân trong bash bị lỗi) và tạo ra các phản hồi phù hợp. bash là một shell, nó được thiết kế để hoạt động bằng cách xâu chuỗi các công cụ bên ngoài.
dùng1686
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.