Mô phỏng thao tác nhấn phím ENTER trong tập lệnh bash


97

Tôi đã tạo một tập lệnh bash thực sự đơn giản chạy một vài lệnh. một trong những lệnh này cần người dùng nhập trong thời gian chạy. tức là nó hỏi người dùng "bạn có muốn blah blah blah không?", tôi chỉ muốn gửi một phím enter đến đây để script sẽ hoàn toàn tự động.

Tôi sẽ không phải đợi đầu vào hoặc bất cứ thứ gì trong thời gian chạy, chỉ cần gửi phím nhấn và bộ đệm đầu vào sẽ xử lý phần còn lại.


1
Nếu công cụ bạn đang cố gắng tự động hóa apt-get, giải pháp thích hợp là chèn sẵn cơ sở dữ liệu debconf với các giá trị ưa thích của bạn; thì nó sẽ không hỏi bạn.
tripleee

Bạn có thể sử dụng printf thay vì echo: printf "hello \ n"
hassanzadeh.sd

Câu trả lời:


133
echo -ne '\n' | <yourfinecommandhere>

hoặc tận dụng dòng mới tiềm ẩn mà tiếng vang tạo ra (cảm ơn Marcin)

echo | <yourfinecommandhere>

Bây giờ chúng ta có thể chỉ cần sử dụng --sktùy chọn:

--sk, --skip-keypressĐừng đợi một lần nhấn phím sau mỗi lần kiểm tra

I E sudo rkhunter --sk --checkall


1
nếu bạn cung cấp đầu ra này cho xxdbạn, bạn sẽ nhận được 5c6ehex, đó là một nghĩa đen \n. nếu bạn chỉ làm, echo | xxd bạn thực sự kết thúc với một hex của 0a. Vì vậy, tôi đoán sử dụng bất kỳ chương trình nào của bạn cần.
Marcin

3
@Marcin, tôi rất ngạc nhiên, tôi nhận được 0a0ađiều đó vẫn không như dự định, thêm một -ndòng mới ngầm ẩn. Nhưng tất nhiên của bạn là đúng, một echo | ...công việc đơn giản ở đây. Sẽ cập nhật câu trả lời của tôi.
Tilman Vogel

Heh, nó có vẻ không phù hợp với tôi, vì vậy tôi phải cho nó ăn qua xxd. Nó cho đến nay là phương pháp đơn giản nhất nhưng hiệu quả để xem chính xác những gì các lệnh xuất ra. Gotta yêu những thủ thuật Unix ngu ngốc.
Marcin

@Marcin, vẫn còn, tại sao bạn nhận được 5c6e? Bạn có bỏ qua -ehay không hoặc echokhông xử lý vỏ của bạn hoặc không xử lý tùy chọn đó?
Tilman Vogel

tôi nhận được: echo -ne "\n" | xxd 0000000: 0aecho -n "\n" | xxd 0000000: 5c6eecho "\n" | xxd 0000000: 5c6e 0a tôi không thấy bất kỳ sự khác biệt nào giữa dấu nháy đơn và dấu ngoặc kép. Vỏ của tôi chỉ là một bash thông thường, có cài đặt nào sẽ điều chỉnh hành vi của chức năng cơ bản như vậy không?
Marcin

43

Bạn có thể thấy yeslệnh hữu ích.

Xem man yes


54
yesTôi thấy nó hữu ích.
Pureferret

2
Thao tác này mô phỏng việc nhấn "y" nhiều lần thay vì phím Enter. Mặc dù đây có thể là những gì bạn muốn cho câu hỏi có / không, nhưng nó sẽ không hiệu quả đối với bất kỳ thứ gì không mong đợi một chữ "y".
Burhan Ali,

5
@BurhanAli: bạn có thể thay đổi những gì yesgửi dưới dạng đầu ra của nó. Đọc trang người đàn ông.
siride

1
tôi có thể gửi yes nhiều lần cho một tập lệnh yêu cầu giá trị mặc định [value] {enter}
AK_

Điều này chỉ hoạt động cho những thứ như yum. Nơi mà chuỗi được mong đợi.
einarc


22

Đây là cách sử dụng mẫu bằng cách sử dụng expect:

#!/usr/bin/expect
set timeout 360
spawn my_command # Replace with your command.
expect "Do you want to continue?" { send "\r" }

Kiểm tra: man expectđể biết thêm thông tin.


đặc biệt hữu ích nếu bạn cần phải gửi nhiều phím enter
Andy

Đây là cách tốt nhất, đặc biệt cho những thứ như phars nơi các chuỗi stdout và stdin khác nhau được gửi.
einarc

Cũng nên nhớ chỉ nhập my_command arg nếu bạn có đối số.
einarc

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.