Імітація натискання клавіші ENTER у сценарії bash


97

Я створив дуже простий скрипт bash, який запускає кілька команд. одна з цих команд потребує введення користувачем під час виконання. тобто він запитує у користувача "ти хочеш бла-бла-бла?", я хочу просто надіслати на це клавішу введення, щоб сценарій був повністю автоматизований.

Мені не доведеться чекати введення чи чогось іншого під час виконання, його достатньо, щоб просто надіслати натискання клавіші, а вхідний буфер впорається з рештою.


1
Якщо інструментом, який ви намагаєтеся автоматизувати, є apt-getправильне рішення - попередньо заповнити базу даних debconf бажаними значеннями; тоді воно вас не запитає.
— триплі

Ви можете використовувати printf замість луни: printf "привіт \ n"
— hassanzadeh.sd

Відповіді:


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

або скористатися імпліцитним новим рядком, який генерує ехо (спасибі Marcin)

echo | <yourfinecommandhere>

Тепер ми можемо просто скористатися --skопцією:

--sk, --skip-keypressНе чекайте натискання клавіші після кожного тесту

тобто sudo rkhunter --sk --checkall


1
якщо ви подасте цей результат, xxdви отримаєте 5c6eшістнадцяткову форму, що є буквалом \n. якщо ви робите просто echo | xxd ви насправді в кінцевому підсумку з hex 0a. Тому я думаю, використовуйте те, що потрібно вашій програмі.
— Marcin

3
@Marcin, я здивований, я отримую те, 0a0aщо все ще не так, як передбачалося, додавши -nвиразний імпліцитний новий рядок. Але ви, звичайно, праві, рівнина echo | ...тут чудово працює. Оновить мою відповідь.
— Тілман Фогель

Хе, мені це здавалося не зовсім правильно, тому я мусив годувати це через xxd. На сьогоднішній день це найпростіший, але ефективний спосіб побачити, які саме команди виводяться. Потрібно любити дурні трюки Unix.
— Marcin

@Marcin, все-таки, чому ти отримуєш 5c6e? Ви пропустили -eабо ваша оболонка чи echoне обробляла такий варіант?
— Тілман Фогель

я отримую: echo -ne "\n" | xxd 0000000: 0a і , echo -n "\n" | xxd 0000000: 5c6e і echo "\n" | xxd 0000000: 5c6e 0a я не бачив ніякої різниці між одинарними і подвійними лапками. Моя оболонка - це звичайний bash, чи є параметри, які регулюють поведінку такої базової функціональності?
— Marcin

43

Можливо, ця yesкоманда виявиться корисною.

Побачити man yes


54
yesЯ вважаю це корисним.
— Pureferret

2
Це імітує повторне натискання "y", а не клавішу Enter. Хоча це, мабуть, саме те, що ви хочете запитати так / ні, воно не спрацює ні для чого, що не очікує «у».
— Бурхан Алі

5
@BurhanAli: ви можете змінити те, що yesнадсилає як результат. Прочитайте сторінку керівництва.
— siride

1
Чи можу я надіслати стільки разів для сценарію, який очікує значень за замовчуванням [значення] {enter}
— AK_

Це працює лише для таких речей, як ням. Де цей рядок очікується.
— einarc


22

Ось приклад використання за допомогою expect:

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

Перевірте: man expectдля отримання додаткової інформації.


особливо корисно, якщо потрібно надіслати кілька натискань клавіш
— Енді

Це найкращий спосіб, особливо для таких речей, як phars, де надсилаються різні рядки stdout та stdin.
— einarc

Також не забудьте просто ввести аргумент my_command, якщо у вас є аргумент.
— einarc

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.